我正在使用Processing。
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列表,获取指数然后用这些指数对敌人进行排序。
答案 0 :(得分:1)
来自评论Feed:
我想传递一个名为field的字符串,我可以说sortEnemies('x',listofenemies);还有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”,尽管它可以是您喜欢的任何内容,只要您在使用时使用相同的名称并把它拿出来。
此答案与原始答案有很大不同,但您可以点击下面的“已修改”链接查看不同版本。