【发布时间】:2011-12-23 14:23:16
【问题描述】:
我有一组 Duck 对象,我想使用多个键对它们进行排序。
class Duck {
DuckAge age; //implements Comparable
DuckWeight weight; //implements Comparable
String name;
}
List<Duck> ducks = Pond.getDucks();
例如。我想主要按权重,其次按年龄对它们进行排序。如果两只鸭子的体重和年龄完全相同,那么让我们使用它们的名称作为第三键来区分它们。我可能会这样做:
Collections.sort(ducks, new Comparator<Duck>(){
@Override
public int compare(Duck d1, Duck d2){
int weightCmp = d1.weight.compareTo(d2.weight);
if (weightCmp != 0) {
return weightCmp;
}
int ageCmp = d1.age.compareTo(d2.age);
if (ageCmp != 0) {
return ageCmp;
}
return d1.name.compareTo(d2.name);
}
});
好吧,我经常这样做,但这个解决方案闻起来不太对劲。它不能很好地扩展,而且很容易搞砸。肯定有更好的方法来使用多个键对 Ducks 进行排序!有人知道更好的解决方案吗?
EDIT 删除了不必要的else 分支
【问题讨论】:
-
看起来还不错,你可以去掉一层缩进,去掉
else,因为在if你返回,所以不需要。 -
+1 让你的鸭子井然有序
-
核心Java本身就没有优雅的解决方案吗?
-
嘿,我有一个问题要问你......我完全不知道这个比较的东西是如何工作的......你的对象“鸭子”在排序后会被覆盖吗??
-
Collections.sort()修改给定集合本身(而不是返回集合的排序副本)。因此,ducks对象“被覆盖”,因为它是就地排序的。 (实际上不是就地:ducks的内容被转储到一个数组中,在那里它被排序,结果被复制回原始集合。)
标签: java sorting comparator comparable