在Java中按属性值对对象ArrayList进行排序

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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));

【讨论】:

以上是关于在Java中按属性值对对象ArrayList进行排序的主要内容,如果未能解决你的问题,请参考以下文章

基于Java中另一个arraylist中的对象值对arraylist进行排序

在Objective-C中按一个属性对自定义对象的NSSet进行排序

在 Ruby 中按布尔值对对象进行排序

如何在PHP中按值对对象数组进行排序

如何在reactjs / javascript中按值对对象数组进行分组

在kotlin的自定义类型arraylist中按id搜索对象[重复]