Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Treeset不';t删除对象-Java_Java_Treeset - Fatal编程技术网

Treeset不';t删除对象-Java

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

我在项目中使用Treeset来存储一个对象类(我很早就创建了)

我还实现了build()方法,该方法必须在树集合中添加对象,而且效果非常好。 现在我必须实现remove()方法(它必须删除指定为参数的对象),但我有一个问题:它没有删除它:

 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() );
    }