首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用多个键对Java对象进行排序

使用多个键对Java对象进行排序
EN

Stack Overflow用户
提问于 2011-11-07 20:22:26
回答 7查看 15.8K关注 0票数 55

我有一个Duck对象的集合,我想使用多个键对它们进行排序。

代码语言:javascript
复制
class Duck {
    DuckAge age; //implements Comparable
    DuckWeight weight; //implements Comparable
    String name;
}
List<Duck> ducks = Pond.getDucks();

例如:我想主要根据它们的对它们进行排序,其次是根据它们的年龄进行排序。如果两只鸭子具有完全相同的体重和完全相同的年龄,那么让我们使用它们的名称作为第三个关键字来区分它们。我可能会这样做:

代码语言:javascript
复制
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);
    }
});

我经常这样做,但这个解决方案闻起来不对劲。它不能很好地扩展,而且很容易搞砸。当然,肯定有更好的方法来使用多个键对Duck进行排序!有没有人知道更好的解决方案?

编辑删除了不必要的else分支

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-07-17 04:49:15

Java 8解决方案:

代码语言:javascript
复制
Comparator<Duck> cmp = Comparator.comparing(Duck::getWeight)
    .thenComparing(Duck::getAge)
    .thenComparing(Duck::getName);

为lambdas、方法引用和默认方法欢呼:)!太糟糕了,我们不得不定义getter,或者使用显式的lambdas,如下所示:

代码语言:javascript
复制
Comparator<Duck> cmp = Comparator
    .comparing((Duck duck)-> duck.weight)
    .thenComparing((Duck duck)-> duck.age)
    .thenComparing(duck-> duck.name);

类型推断不适用于隐式lambda,因此您必须指定前两个lambda的参数类型。更多详细信息,请访问this answer by Brian Goetz

票数 20
EN

Stack Overflow用户

发布于 2011-11-07 20:29:02

Guava更优雅:

代码语言:javascript
复制
return ComparisonChain.start()
     .compare(d1.weight, d2.weight)
     .compare(d1.age, d2.age)
     .compare(d1.name, d2.name)
     .result();

Apache commons-lang有一个类似的结构,CompareToBuilder

票数 52
EN

Stack Overflow用户

发布于 2011-11-07 20:30:47

代码语言:javascript
复制
List<Duck> ducks = new ArrayList<Duck>();
Collections.sort(ducks, new Comparator<Duck>() {

  @Override
  public int compare(Duck o1, Duck o2) {

    return new org.apache.commons.lang.builder.CompareToBuilder().
        append(o1.weight, o2.weight).
        append(o1.age, o2.age).
        append(o1.name, o2.name).
        toComparison();
  }
});
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8036429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档