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

13
我有一个名为zombieArrayList,其中存储了一个称为Zombie的对象。 Zombie具有属性healthxy。我该如何使用Zombie的属性x(最初具有随机值)按升序对数组进行排序?
我已经找到了一个可能的解决方案(链接)但是我不理解答案的语法。 解释一下那个答案可能会有帮助。
4个回答

31

你想要结合自定义的Comparator,使用 Collections.sort

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值(我们通过返回1来表示),则认为z1z2。基于此,我们对list进行排序。


谢谢您的解释和回答,但是您能更深入地解释一下每个东西的含义吗?如果您能向我解释每行代码,并解释正在发生的事情,那将非常有帮助。 - user2414341
非常丑陋,但它能工作。这似乎是执行此类型排序的唯一方法(类似答案遍布网络)。 - Herb Meehan
你为什么使用了两个 if,而不是一个 else-if? - orrymr
3
在这种情况下,由于有“return”,所以无所谓是哪种方式,你可以采用任何一种方式。 - arshajii

7
使用JAVA 8实现如下:
zombie.sort((Zombie z1, Zombie z2) -> {
   if (z1.x() > z2.x())
     return 1;
   if (z1.x() < z2.x())
     return -1;
   return 0;
});

现在List接口直接支持sort方法


0

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

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

也可以工作。


0

使用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));

如果 `x` 是 `int` 类型,惯用的方式是使用 Comparator.comparingInt
zombie.sort(Comparator.comparingInt(Zombie::getX));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接