Treeset не удаляет объект - Java - PullRequest
0 голосов
/ 17 мая 2018

Я использую Treeset в своем проекте для хранения класса Object (который я создал ранее).

Я также реализовал метод build (), который должен добавить в мой набор объектов Object, и он прекрасно работает. Теперь я должен реализовать метод demolish () (он должен удалить объект, указанный в качестве параметра), но у меня проблема: он не удаляет его:

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

Это декларация ALBEROBELLO

private static TreeSet<Edificio> alberobello;

private static int dimension;

private Skyline(){

    alberobello = new TreeSet<Edificio>();
    dimension = 0;

}

это EDIFICIO Class

public class Edificio implements Comparable, Iterable{

private int anno;
private String pinodeipalazzi;
private String lato;
private int distanza;
private int base;
private int altezza;

public Edificio(int y, String p, String l, int d, int b, int h){
    this.anno = y;
    this.pinodeipalazzi = p;
    this.lato = l;
    this.distanza = d;
    this.base = b;
    this.altezza = h;
}

public int getAltezza() {
    return altezza;
}

public int getAnno() {
    return anno;
}

public int getBase() {
    return base;
}

public int getDistanza() {
    return distanza;
}

public String getLato() {
    return lato;
}

public String getPinodeipalazzi() {
    return pinodeipalazzi;
}

@Override
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;

}


@Override
public Iterator iterator() {
    return new Iterator() {
        @Override
        public boolean hasNext() {
            return false;
        }

        @Override
        public Object next() {
            return null;
        }
    };
}

@Override
public void forEach(Consumer action) {

}

1 Ответ

0 голосов
/ 17 мая 2018

Ваш метод 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;
}

PS Было бы лучше не использовать raw 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 remove():

    if(edificio.getPinodeipalazzi().equals(p) && edificio.getAnno() == y){
        iterator.remove();
        dimension --;
        System.out.println("Removed: " + edificio.getPinodeipalazzi()+ " " + edificio.getAnno() + " " +alberobello.size() );
    }
...