【问题标题】:Sorting an object ArrayList by an attribute value in Java在Java中按属性值对对象ArrayList进行排序
【发布时间】:2013-05-21 00:47:42
【问题描述】:

我有ArrayList zombie,其中填充了一个名为Zombie 的对象。 Zombie 具有属性healthxy。如何使用Zombie 的属性x 对数组进行升序排序,该属性设置为最初具有随机值?

我已经为我的问题找到了可能的solution,但我不明白答案的语法。解释这个答案也可能会有所帮助。

【问题讨论】:

    标签: java sorting object arraylist


    【解决方案1】:

    您希望将Collections.sort 与自定义Comparator 结合使用。

    Collections.sort(list, new Comparator<Zombie>() {
        @Override
        public int compare(Zombie z1, Zombie z2) {
            if (z1.x() > z2.x())
                return 1;
            if (z1.x() < z2.x())
                return -1;
            return 0;
        }
    });
    

    本质上,Comparator 是一个键,表示应如何通过其compare 方法对列表进行排序。对于上面的Comparator,如果z1 具有更高的x 值,我们认为z1z2更大(我们通过返回1 来显示这一点)。基于此,我们对list进行排序。

    【讨论】:

    • 感谢您的解释和回答,但是您能更深入地了解一切的含义吗?如果你能向我解释每一行代码,并解释到底发生了什么,那将是最有帮助的。
    • 非常丑陋,但它确实有效。这看起来是进行此类排序的唯一方法(整个网络上都有类似的答案)。
    • 你为什么使用 2 个 if,而不是 else-if?
    • @orrymr 在这种情况下没关系,因为return;无论哪种方式都可以。
    【解决方案2】:

    使用 JAVA 8 执行此操作:

    zombie.sort((Zombie z1, Zombie z2) -> {
       if (z1.x() > z2.x())
         return 1;
       if (z1.x() < z2.x())
         return -1;
       return 0;
    });
    

    列表接口现在直接支持排序方法

    【讨论】:

      【解决方案3】:

      这是旧的,但我发现它很有用。

      zombie.sort((Zombie z1,Zombie z2) -> (Integer.compare(z1.x(),z2.x())));
      

      也可以。

      【讨论】:

        【解决方案4】:

        使用Stream API的Java-8解决方案:

        List<Zombie> sorted = zombie.stream()
                                    .sorted(Comparator.comparing(Zombie::getX))
                                    .collect(Collectors.toList());
        

        如果xint 类型,惯用的方法是使用Comparator.comparingInt

        List<Zombie> sorted = zombie.stream()
                                    .sorted(Comparator.comparingInt(Zombie::getX))
                                    .collect(Collectors.toList());
        

        如果要对原始列表进行排序,zombie 本身:

        zombie.sort(Comparator.comparing(Zombie::getX));
        

        如果xint 类型,惯用的方法是使用Comparator.comparingInt

        zombie.sort(Comparator.comparingInt(Zombie::getX));
        

        【讨论】:

          猜你喜欢
          • 2020-01-12
          • 2011-03-21
          • 1970-01-01
          • 2013-02-12
          • 2023-04-03
          • 2016-02-08
          • 1970-01-01
          • 2011-02-16
          • 2012-08-05
          相关资源
          最近更新 更多