【发布时间】:2018-05-13 10:53:59
【问题描述】:
我遇到了 TreeSet 比较器实现的问题。我有一个简单的游戏,动物在棋盘上行走,每转一圈,它们会做一个动作,如果它们因某种原因死亡,它们会被标记为“死亡”,放入“DeadOrganisms”列表,然后从树集“队列”中删除" 在这段代码中(我无法立即删除它们,因为我正在遍历树集):
for(Organism org : DeadOrganisms){
queue.remove(org);
}
问题在于,他们中的一些人根本没有被移除,甚至在每回合结束时都没有想到它们因为被标记为“死亡”而被放回了 DeadOrganisms 列表。确保 .remove 每次在死去的有机体上都会被调用,我很确定问题出在 Comparator 类中:
class MyComparator implements Comparator<Organism> {
@Override
public int compare(Organism o1, Organism o2) {
if (o1.getName().equals(o2.getName())) {
return 0;
}
if (o1.getInitiative() > o2.getInitiative()) {
return -1;
} else if (o1.getInitiative() == o2.getInitiative()) {
if (o1.getAge() > o2.getAge()) {
return -1;
} else {
return 1;
}
} else {
return 1;
}
}
}
比较器应该检查 o1 的名称(对于船上的每个角色都是唯一的)是否等于 o2 的名称,其余代码用于根据角色的主动性或年龄对树集进行排序(如果主动性相等)。 所有字符派生自的有机体抽象类的一段代码:
public abstract class Organism {
protected int lastxpos;
protected int lastypos;
private final World myworld;
private int strength;
private int initiative;
private int xPos;
private int yPos;
private int age;
private String name;
Color color;
private boolean isdead;
public Organism(World world, String name){
this.name = name;
this.color = Color.RED;
this.strength = 0;
this.initiative = 0;
this.xPos = 0;
this.yPos = 0;
this.age = 0;
this.isdead = false;
this.myworld = world;
}
我知道我做错了什么或误解了 TreeSet 的工作原理(或两者兼而有之),但我不明白是什么。我也知道.remove
删除元素 e 使得 (o==null ? e==null : o.equals(e))
所以在我的理解中,这就是
if (o1.getName().equals(o2.getName())) {
return 0;
}
在我的 Comparator 类中,但也许我误解了一些东西。 我将不胜感激。
@编辑 我不知道这是否重要,但到目前为止,我正在对一种动物进行测试,具有相同的年龄和主动性,因此所有动物之间的唯一区别是它们的名字。
@EDIT2 我还注意到,如果要删除的生物首先在树集中“队列”中,那么在比较方法中,在调用 queue.remove(org) 之后,“org”永远不会与树集中的第一个对象(又名。本身)只到第二,第三等。
@EDIT3 对于 cmets 中的用户 NPE: 队列声明:
public class World extends JPanel{
*_declarations of some variables_*
private final TreeSet<Organism> queue;
队列初始化:
public World(int sizeX, int sizeY) {
this.queue = new TreeSet<>(new MyComparator());
*_ommitting rest of constructor code_*
}
DeadOrganisms 声明和初始化:
public void EndTurn(){
List<Organism> DeadOrganisms = new ArrayList<>();
*_omitting rest of the EndTurn code_*
}
【问题讨论】:
-
请告诉我们声明和初始化
queue和DeadOrganisms的代码。
标签: java comparator treeset