У меня проблема с реализацией компаратора TreeSet. У меня есть простая игра, где животные ходят по доске, каждый ход они делают одно движение, если они по какой-то причине умирают, они помечаются как «мертвые», помещаются в список «DeadOrganisms» и впоследствии удаляются из очереди «treeset» "в этом фрагменте кода (я не могу удалить их сразу, потому что перебираю набор деревьев):
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, а остальная часть кода предназначена для сортировки набора деревьев по инициативе или возрасту персонажа, если инициатива равна.
Кусок кода для абстрактного класса Organism, из которого происходят все символы:
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;
}
Я знаю, что я делаю что-то не так или неправильно понимаю, как работают TreeSets (или оба), но я не могу понять, что. Я также знаю, что .remove
удаляет элемент e такой, что (o == null? E == null: o.equals (e))
Итак, в моем понимании, это роль
if (o1.getName().equals(o2.getName())) {
return 0;
}
в моем классе Comparator, но, возможно, я что-то неправильно понимаю.
Я был бы очень признателен за любую помощь с этим.
@ EDIT
Я не знаю, имеет ли это значение, но до сих пор я тестирую его на одном типе животных, с одинаковым возрастом и инициацией, поэтому единственное различие между всеми животными - это их имя.
@ EDIT2
Я также заметил, что если удаляемый организм сначала находится в «очереди» древовидной структуры, то в методе сравнения после вызова queue.remove (org) «орг» никогда не сравнивается с первым объектом в древовидной структуре (он же). сам) только второй, третий и т. д.
@ EDIT3
Для пользователя 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_*
}