有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

基于日期和ID的java排序arrayList

我想对任务列表进行排序,首先按日期排序,然后按任务ID排序 下面是代码

ArrayList<fullist> taskdet = new ArrayList<fullist>();
public static class fullist
      {        

 public int date;
 public int id;

 public fullist(int id, int date) {

        this.date = date;
        this.id = id;
    }



}

我用过这些收藏品。排序方法进行排序,但通过此方法,我可以按日期或ID一次排序。 如果按日期排序

Collections.sort(taskdet, new Comparator<fullist>() {

        @Override
        public int compare(fullist o1, fullist o2) {
            //if(o1)
            return Integer.compare(o1.date, o2.date);
        }
    });

这是显示的输出:

 day 19 ID 2
 day 19 ID 1
 day 19 ID 3
 day 20 ID 2
 day 20 ID 1
 day 20 ID 3

如果按ID排序

Collections.sort(taskdet, new Comparator<fullist>() {

        @Override
        public int compare(fullist o1, fullist o2) {
            //if(o1)
            return Integer.compare(o1.date, o2.date);
        }
    });

这是显示的输出:

 day 20 ID 1
 day 19 ID 1
 day 19 ID 2
 day 20 ID 2
 day 20 ID 3
 day 19 ID 3

但产出应该是:

day 19 ID 1
day 19 ID 2
day 19 ID 3
day 20 ID 1
day 20 ID 2
day 20 ID 3

共 (5) 个答案

  1. # 1 楼答案

    使用Java8:

        taskdet.sort((a, b) -> {
            int r = a.date - b.date;
            return r == 0 ? r : a.id - b.id;
        });
    
  2. # 2 楼答案

    另一个不错的解决方案是使用番石榴ComparisonChain

    public int compare(fullist o1, fullist o2) {
        return ComparisonChain.start()
                              .compare(o1.date, o2.date)
                              .compare(o1.id, o2.id)
                              .result();
    }
    
  3. # 3 楼答案

    如果使用Java 8,则可以编写:

    taskdet.sort(comparingInt(fullist::getDate).thenComparingInt(fullist::getId));
    

    这假设您有一个getDategetIdgetter,并且该静态导入:

    import static java.util.Comparator.comparingInt;
    
  4. # 4 楼答案

    如果date值相同,则需要使用Comparator来比较id

    @Override
    public int compare(fullist o1, fullist o2) {
        int comp = Integer.compare(o1.date, o2.date);
        if (comp == 0)
        {
            comp = Integer.compare(o1.id, o2.id);
        }
        return comp;
    }
    
  5. # 5 楼答案

    这将有助于:

    Collections.sort(taskdet, new Comparator<Fullist>() {
    
            @Override
            public int compare(fullist o1, fullist o2) {                
                int res = Integer.compare(o1.date, o2.date);
                if(res == 0)
                    return o1.id - o2.id
                return res;
            }
        });