我有一个对象的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);
}
List<Foo> sorted = list.stream()
.sorted(Comparator.comparing(Foo::getDate)
.thenComparing(Foo::getValue))
.collect(Collectors.toList());
列表
进行排序:list.sort(Comparator.comparing(Foo::getDate)
.thenComparing(Foo::getValue));
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;
}
});
Ordering
类:http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Ordering.html - Michael Brewer-Davis