基于多个属性对ArrayList进行排序

时间:2010-11-30 02:29:07

标签: java sorting

我有一个对象的ArrayList。该对象包含属性datevalue。所以我想对date上的对象进行排序,对于同一日期的所有对象,我想在value上对它们进行排序。我怎么能这样做?

5 个答案:

答案 0 :(得分:22)

实施自定义Comparator,然后使用Collections.sort(List, Comparator)。它可能看起来像这样:

public class FooComparator implements Comparator<Foo> {
    public int compare(Foo a, Foo b) {
        int dateComparison = a.date.compareTo(b.date);
        return dateComparison == 0 ? a.value.compareTo(b.value) : dateComparison;
    }
}

Collections.sort(foos, new FooComparator());

答案 1 :(得分:3)

public static <T> void sort(List<T> list, final List<Comparator<T>> comparatorList) {  
       if (comparatorList.isEmpty()) {//Always equals, if no Comparator.  
            throw new IllegalArgumentException("comparatorList is empty.");  
       }  
       Comparator<T> comparator = new Comparator<T>() {  
       public int compare(T o1, T o2) {  
               for (Comparator<T> c:comparatorList) {  
                   if (c.compare(o1, o2) > 0) {  
                     return 1;  
                   } else if (c.compare(o1, o2) < 0) {  
                     return -1;  
                   }  
               }  
               return 0;  
         }  
       };  
       Collections.sort(list, comparator);  
  } 

答案 2 :(得分:1)

如果您想要示例代码,可以使用以下命令:

Collections.sort(foos, new Comparator<Foo>{
    public int compare(Foo a, Foo b) {
        int dateComparison = a.date.compareTo(b.date);
        return dateComparison == 0 ? a.value.compareTo(b.value) : dateComparison;
    }
});

答案 3 :(得分:0)

如果对象的类实现Comparable,那么您需要做的就是正确编写compareTo方法以首先比较日期,然后如果日期相等,则比较值,然后根据结果返回相应的int结果

答案 4 :(得分:0)

使用 Stream API 的 Java-8 解决方案:

List<Foo> sorted = list.stream()
                        .sorted(Comparator.comparing(Foo::getDate)
                                        .thenComparing(Foo::getValue))
                        .collect(Collectors.toList());

如果要对原始 list 本身进行排序:

list.sort(Comparator.comparing(Foo::getDate)
                    .thenComparing(Foo::getValue));