我在我的项目中使用Treeset存储一个Object类(我早期创建的)。
我还实现了build()方法,它必须在我的树集中添加Object并且它工作得很好。 现在我要实现demolish()方法(它必须删除指定为参数的对象),但我有问题:它不会删除它:
unsafe
这是ALBEROBELLO宣言
private void demolish(int y, String p){
Iterator iterator = alberobello.iterator();
while(iterator.hasNext()){
Edificio edificio = (Edificio) iterator.next();
if(edificio.getPinodeipalazzi().equals(p) && edificio.getAnno() == y){
alberobello.remove(edificio);
dimension --;
System.out.println("Removed: " + edificio.getPinodeipalazzi()+ " " + edificio.getAnno() + " " +alberobello.size() );
}
}
}
这是EDIFICIO Class
private static TreeSet<Edificio> alberobello;
private static int dimension;
private Skyline(){
alberobello = new TreeSet<Edificio>();
dimension = 0;
}
答案 0 :(得分:2)
您的compareTo
方法是问题的根源:
public int compareTo(Object o) {
if((o == null) || this.distanza > ((Edificio)o).distanza)
return 1;
/*else if(this.distanza == ((Edificio)o).distanza)
return 0;*/
else
return -1;
}
由于它永远不会返回0,因此找不到您要从TreeSet
中删除的元素。
我不确定为什么你注释掉了返回0的部分,但你应该取消注释:
public int compareTo(Object o) {
if((o == null) || this.distanza > ((Edificio)o).distanza)
return 1;
else if(this.distanza == ((Edificio)o).distanza)
return 0;
else
return -1;
}
P.S。最好不要使用原始Comparable
。将您的班级更改为:
public class Edificio implements Comparable<Edificio>
{
...
@Override
public int compareTo(Edificio o) {
if((o == null) || this.distanza > o.distanza)
return 1;
else if(this.distanza == o.distanza)
return 0;
else
return -1;
}
...
}
编辑:您的代码的另一个问题是,remove()
无法移除元素而隐藏,是您在迭代alberobello.remove(edificio)
时调用Set
。修复ConcurrentModificationException
方法后,可能会抛出compareTo
。您应该只使用Iterator
的{{1}}方法:
remove()