我有一个对象的ArrayList。该对象包含属性date
和value
。所以我想对date
上的对象进行排序,对于同一日期的所有对象,我想在value
上对它们进行排序。我怎么能这样做?
答案 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)
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));