gpt4 book ai didi

java - 如何按字段对自定义对象的集合进行排序,该字段本身就是一个对象java

转载 作者:行者123 更新时间:2023-11-30 07:26:00 25 4
gpt4 key购买 nike

我正在使用处理。

public void sortEnemies(final String field, List<Enemy> itemLocationList) {
Collections.sort(itemLocationList, new Comparator<Enemy>() {
@Override
public int compare(Enemy o1, Enemy o2) {
if (field.equals("r")) {
if (o1.r<o2.r)
{
return -1;
}
if (o1.r>o2.r)
{
return 1;
}
if (o1.r==o2.r)
{
return 0;
}
}

println("shoudl not have reached here.");
return 0;
}
}
);
}

使用比较器通过原始字段(例如半径 r)对我拥有的这些敌人进行排序是很容易的。我想要做的是:每个敌人内部都有一个名为 loc 的 PVector 对象,该对象具有原始字段 loc.x 和 loc.y。我将如何修改此代码以按对象内的 PVector 对象进行排序?那可能吗?例如,我只想按 x 或 y 坐标进行排序,但我不确定如何以类似的方式编写它。

本质上,问题是:如何通过字段对对象数组进行排序,该字段本身就是一个具有我想要排序依据的字段的对象。

编辑:我发现这里也有类似的问题 Sort ArrayList of custom Objects by property

但我不想使用 lambda 表示法,因为我不认为处理使用 java 8(不确定)。我无法修改 PVector 类。我已经找到了一种对 PVector 对象列表进行排序的方法,但这似乎是一种非常迂回的方法,可以创建敌人的 pvector 列表,获取索引,然后使用这些索引对敌人进行排序。

最佳答案

来自评论源:

I want to pass a String called field where i can say sortEnemies('x', listofenemies); and also sortEnemies('r', listofenemies);

我建议将字段名称映射到比较器,如下所示:

Map<String, Comparator<Enemy>> comparators = new HashMap<>();

comparators.put("health", new Comparator<Enemy>() {
@Override
public int compare(Enemy o1, Enemy o2) {
if (o1.health < o2.health)
return -1;
if (o1.health > o2.health)
return 1;
return 0;
}
});

comparators.put("x", new Comparator<Enemy>(){
@Override
public int compare(Enemy o1, Enemy o2) {
if (o1.loc.x < o2.loc.x)
return -1;
if (o1.loc.x > o2.loc.x)
return 1;
return 0;
}
});

当您想要对项目进行排序时,请按名称获取适当的比较器:

Comparator<Enemy> comparator = comparators.get("x");
if (comparator == null)
throw new RuntimeException("No such comparator exists!");
Collections.sort(itemLocationList, comparator);

我建议完全限定名称,即使用“loc.x”作为名称,而不仅仅是“x”,尽管它可以是您喜欢的任何名称,只要您在放入时使用相同的名称即可然后把它拿出来。

这个答案与原始答案有很大不同,但您可以通过点击下面的“已编辑”链接来查看不同的版本。

关于java - 如何按字段对自定义对象的集合进行排序,该字段本身就是一个对象java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36806569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com