Treeset不会删除对象 - Java

时间:2018-05-17 08:37:26

标签: java treeset

我在我的项目中使用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;

}

1 个答案:

答案 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()