Treeset不';t删除对象-Java
我在项目中使用Treeset来存储一个对象类(我很早就创建了) 我还实现了build()方法,该方法必须在树集合中添加对象,而且效果非常好。 现在我必须实现remove()方法(它必须删除指定为参数的对象),但我有一个问题:它没有删除它:Treeset不';t删除对象-Java,java,treeset,Java,Treeset,我在项目中使用Treeset来存储一个对象类(我很早就创建了) 我还实现了build()方法,该方法必须在树集合中添加对象,而且效果非常好。 现在我必须实现remove()方法(它必须删除指定为参数的对象),但我有一个问题:它没有删除它: private void demolish(int y, String p){ Iterator iterator = alberobello.iterator(); while(iterator.hasNext()){ Ed
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() );
}
}
}
这是阿尔贝罗宣言
private static TreeSet<Edificio> alberobello;
private static int dimension;
private Skyline(){
alberobello = new TreeSet<Edificio>();
dimension = 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;
}
由于它从不返回0,因此找不到您试图从树集合中删除的元素
我不确定您为什么注释掉返回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;
}
另外,最好不要使用原始可比。将您的班级改为:
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;
}
...
}
请显示alberobello
…的声明和体系结构
类。他不必实现equals和hashcode以确保在set中找到对象吗?@JackFlamp在使用TreeSet和实现可比接口时可能不需要。这一套的重点是排序。您需要@JackFlamp No,在树集合中hashCode
和equals
不使用。只有compareTo
(或者compare
如果使用了Comparator
)是的,因为ConcurrentModificationException,我对它进行了注释,我解决了取消注释并使用迭代器的问题。remove@Eran你确定吗。“删除元素e,以便(o==null?e==null:o.equals(e))”
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;
}
...
}
if(edificio.getPinodeipalazzi().equals(p) && edificio.getAnno() == y){
iterator.remove();
dimension --;
System.out.println("Removed: " + edificio.getPinodeipalazzi()+ " " + edificio.getAnno() + " " +alberobello.size() );
}