4 Stimmen

Gleiches Element aus der Java-Liste entfernen

Ich habe eine Liste von Elementen, wobei jedes Element eine einfache Klasse mit 2 öffentlichen Strings ist. Ich habe eine equals-Methode, die einfach die equalsIgnoreCase-Methode von String für beide Strings verwendet.

public class data
{
    public String a;
    public String b;

    public boolean equals(data d)
    {
        if(a.equalsIgnoreCase(d.a) && b.equalsIgnoreCase(d.b))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

Ich möchte in der Lage sein, ein Element zu entfernen, auch wenn es nicht dieselbe Instanz des Elements in der Liste ist, aber gleichwertig mit ihm.

Im Moment mache ich das:

public void remove(data dataToRemove)
{
    for(data i : _list)
    {
        if(i.equals(dataToRemove))
        {
            _list.remove(i);
            break;
        }
    }
}

Gibt es eine bessere Möglichkeit, dies zu tun?

16voto

assylias Punkte 308529

Einige Bemerkungen:

  • Ihr equals Methode n'est pas Überschreiben Sie die equals Methode der Object (Argument sollte sein Object Typ, nicht data Typ).
  • Sie sollten Ihre equals Methode zur Berücksichtigung von Nullen usw.
  • Und schließlich sollten Sie die hashcode() auch, wenn Sie die equals() - Wenn dies nicht der Fall ist, kann es zu seltsamen Verhaltensweisen kommen, wenn Sie beispielsweise Sets oder Maps verwenden.

Wenn Sie die Funktion equals Methode, können Sie dann einfach die remove Methode. Siehe unten die automatisch generierte equals et hashcode generiert von Netbeans, geändert, um die equalsIgnoreCase Methode.

public static void main(String[] args) {
    List<Data> list = new ArrayList<Data>();
    list.add(new Data("a", "b"));
    list.add(new Data("a", "c"));
    System.out.println(list.size()); //2
    list.remove(new Data("A", "b"));
    System.out.println(list.size()); //1
}

public static class Data {

    public String a;
    public String b;

    public Data(String a, String b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) return false;
        if (getClass() != obj.getClass()) return false;
        final Data other = (Data) obj;
        boolean sameA = (this.a == other.a) || (this.a != null && this.a.equalsIgnoreCase(other.a));
        if (!sameA) return false;
        boolean sameB = (this.b == other.b) || (this.b != null && this.b.equalsIgnoreCase(other.b));
        if (!sameB) return false;
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 89 * hash + (this.a == null ? 0 :this.a.toUpperCase().hashCode());
        hash = 89 * hash + (this.b == null ? 0 : this.b.toUpperCase().hashCode());
        return hash;
    }

}

1voto

Hiro2k Punkte 4735

Der eindeutigste Weg ist der Aufruf der entfernen Methode der Liste ohne Schleifen und übergeben Sie Ihr Objekt als Parameter. Es verwendet die Methode equals, die Sie für das Objekt definiert haben, um es zu finden und zu entfernen, wenn es in der Liste existiert.

_list.remove(data);

Sie müssen auch nicht die Hashcode-Methode angeben, aber Sie sollten sich angewöhnen, immer einen zu erstellen, wenn Sie die equals-Methode überschreiben, falls Sie sie in einer Sammlung wie einem Set oder einer Map verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X