在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
具有属性health
、x
、y
。如何使用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
值,我们认为z1
比z2
更大(我们通过返回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());
如果x
是int
类型,惯用的方法是使用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));
【讨论】:
以上是关于在Java中按属性值对对象ArrayList进行排序的主要内容,如果未能解决你的问题,请参考以下文章
基于Java中另一个arraylist中的对象值对arraylist进行排序
在Objective-C中按一个属性对自定义对象的NSSet进行排序