【发布时间】:2011-05-17 15:17:59
【问题描述】:
我有一个对象的 ArrayList。该对象包含属性date 和value。所以我想在date 上对对象进行排序,对于同一日期的所有对象,我想在value 上对它们进行排序。我该怎么做?
【问题讨论】:
我有一个对象的 ArrayList。该对象包含属性date 和value。所以我想在date 上对对象进行排序,对于同一日期的所有对象,我想在value 上对它们进行排序。我该怎么做?
【问题讨论】:
实现自定义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());
【讨论】:
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);
}
【讨论】:
Ordering 类:guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/…
如果你想要示例代码看起来像,你可以使用以下:
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;
}
});
【讨论】:
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));
【讨论】:
如果对象的类实现了 Comparable,那么您只需正确编码 compareTo 方法以首先比较日期,然后如果日期相等,则比较值,然后根据结果返回适当的 int 结果.
【讨论】: