Collection - contains-Methode überschreiben (anonyme innere Klasse)

iTobi97

Aktives Mitglied
Hallo liebe Community,
hier mal wieder ein kleines Problem 😉
Ich möchte bei einer ArrayList mit selbst definierten Objekten mit contains überprüfen, ob die Objekte in der Collection sind.

Für diesen Zweck könnte man ja normalerweise die contains-Methode verwenden und das Objekt übergeben, von dem ich wissen möchte, ob sich dieses in der Collection befindet.
Ich möchte allerdings in einem Unit-Test hardgecodete Objekte mit in einer Methode (algorithmisch) erzeugte Objekte in zwei Collections miteinander vergleichen. Und da funktioniert die contains-Methode nicht mehr, da es ja nicht mehr wirklich die "selben" Objekte sind, sondern mit dem selben Zustand erzeugt werden (Contains-Überprüfung funktioniert ja glaube ich mittels Hashwerten). Das alleinige Überschreiben der equals-Methode der Objekte hat leider nicht geholfen.

Meine Frage wäre, ob ich auf irgendeine Weise die contains-Methode einer Array-List überschreiben kann (z.B. mit einer anonymen inneren Klasse) um herauszufinden, ob die Objekte aus der einen Collection sich auch in der anderen Collection befinden (nicht zwingend in der selben Reihenfolge).

Vielen Dank schon einmal im Voraus
VG Tobias
 
Also Implementierung von contains in ArrayList ist:
Java:
    public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }

    public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }
Also ist deine equals Methode falsch implementiert!
 
Wenn die Reihenfolge keine Rolle spielt, solltest Du die Objekte/Elemente aus der ArrayList in ein Set stecken.

Das geht ganz einfach mit dem Konstruktor von HashSet bzw. TreeSet.

Bei der Verwendung von HashSet muss neben der equals-Methode auch die hashCode-Methode korrekt implementiert sein.

Bei der Verwendung von TreeSet muss neben der equals-Methode auch die compareTo-Methode korrekt implementiert sein, die Ojekte müssen das Interface Comparable implementieren.​
 
@Barista Sorry, mit der Reihenfolge hatte ich gemeint, dass bei der contains-Methode die Reihenfolge der Elemente in der Liste keine Rolle spielen soll. Die Reihenfolge innerhalb des Arrays ist dagegen essentiell.

Auf den Punkt mit der hashCode-Methode bin ich auch schon gestoßen, allerdings habe ich die ehrlich gesagt noch nie überschrieben und weiß nicht wofür die überhaupt verwendet wird.

Müssen alle Objekte von der Liste wirklich Comparable implementieren? Oder reicht es, die Hash-Methode zu überschreiben? Und an welcher Stelle überschreibe ich hash-Code? Wird das eventuell in einer anonymen inneren Klasse, die von ArrayList erbt gemacht?
 
Das überschreiben von hashCode, equals und compareTo passiert in den Klassen, die du in die ArrayList (oder TreeSet oder was auch immer) legen möchtest, also bei den
selbst definierten Objekten
wobei ich davon ausgehe, dass "selbst definierte Objekte" Instanzen von einer selbst geschrieben Klasse sind.
Wenn du wie oben gezeigt, deine Objekte in eine ArrayList packst, musst du nur equals() überschreiben.
 

Neue Themen


Zurück
Oben