Vergleichen Sie Objekte in LinkedList.enthält()
Ich möchte in der Lage sein, LinkedList.contains() true zurück, für eine benutzerdefinierte Komparator.
Nehme an, dass ich 1 LinkedList und 2 Objekte
LinkedList<MyObject> myList = new LinkedList<MyObject>();
MyObject a = new MyObject("HELLO");
MyObject b = new MyObject("HELLO");
Technisch, die beiden Objekte sind identisch in Bezug auf Vergleich (MyObject implements Vergleichbar)
( a == b ) == true
jedoch, wenn ich den folgenden, myList nicht true zurück für myList.enthält, (b)
myList.add(a)
myList.contains(b) //== false
Ich denke, die da beinhaltet, überprüfen Sie die Objekt-Referenz und sehen, dass a und b sind 2 unterschiedliche Objekte.
Gibt es eine Möglichkeit, dass ich es so machen kann, ich habe nicht zu verlängern LinkedList vergleichen Sie diese Objekte?
InformationsquelleAutor Eric | 2009-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
LinkedList mithilfe der equals-Methode, nicht Vergleichbar.compareTo. Sollten Sie überschreiben Sie equals (und hashCode) in MyObject um das problem zu lösen.
Keine Ahnung warum die @Override-tag, sagt ich bin nicht überschreiben alles, wenn ich definieren eine equals-Methode in MyObject?
Es herausgefunden: Methode definition public boolean equals(MyObject obj) nicht auslösen überschreiben, aber public boolean equals(Object obj) nicht.
InformationsquelleAutor Brett Daniel
Den
contains()
Methode verwendetequals()
um zu bestimmen, ob ein Objekt in der Liste. Ich vermute, Ihr KlasseMyObject
überschreibt nicht dieequals()
Methode, und dies wird der Grund sein, warummyList.contains(b)
zurückfalse
.InformationsquelleAutor Luke Woodward
Sie außer Kraft setzen müssen .equals(Oject) und die .hashCode () - Methoden in der MyObject-Klasse (hashCode ist es nicht notwendig, für die Liste... aber wenn du overrite entspricht der Vertrag sagt, muss man hashCode überschreiben).
Im wesentlichen, was der enthält tut, ist dies:
Werfen Sie einen Blick auf die Dokumentation für das Objekt (für equals und hashCode) hier
Auch ein wirklich gutes Buch zu Lesen ist Effektive Java
InformationsquelleAutor TofuBeer
Meinst du
a.equals(b)
undb.equals(a)
zurücktrue
? Dies ist nicht das gleiche als eine Prüfung auf Referenz-Gleichheit, noch einen Scheck füra.compareTo(b) == 0
.LinkedList.enthält()
verwendetequals()
, so dass Sie haben, um sicherzustellen, dass die Methode wurde richtig implementiert.equals()
sollte auch im Einklang mitcompareTo()
, obwohl dies nicht unbedingt erforderlich ist. Wenn Sie einen hash-basierten Datenstruktur (z.B.HashSet
), müssen Sie sicherstellen, dasshashCode()
ist richtig implementiert.InformationsquelleAutor Zach Scrivena
In der Dokumentation für die contains-Methode ist wie folgt:
Daher müssen Sie das überschreiben der MyObject - equals(Object o) Methode.
Also für dein Beispiel:
Brauchen Sie nicht zu implementieren alles, was mit dem Vergleichbar Schnittstelle.
InformationsquelleAutor mweiss
Anstatt verwenden Sie eine LinkedList zu durchsuchen jedes element, Haben Sie sich überlegt mit einem neuen HashSet(Komparator). Dies wird effizient vergleichen die Elemente, um eine übereinstimmung zu finden.
InformationsquelleAutor Peter Lawrey