java - Wie finde ich passende Objekte zwischen zwei Listen?

8

Bei zwei Listen, von denen jede den gleichen Objekttyp enthält, würde ich gerne Objekte auf der Grundlage einiger Eigenschaftswerte zwischen den beiden übereinstimmenden Listen finden.

z.B. Ein Objekt aus List1, L1Obj, stimmt mit einem Objekt aus List2, L2Obj überein, wenn L1Obj.a == L2Obj.a UND L1Obj.b == L2Obj.c UND L1Obj.c == L2Obj.c

Diese Eigenschaften sind nicht die einzigen Eigenschaften der Klasse, aber sie sind alles, was benötigt wird, um ein Objekt innerhalb einer Liste eindeutig zu identifizieren.

Meine Frage ist - was ist der beste Weg, dies zu erreichen?

Eine Möglichkeit wäre, HashMaps basierend auf den Listen zu konstruieren, wobei der verkettete String-Wert von a + b + c als Schlüssel zum Indizieren eines Objekts verwendet wird. Auf diese Weise konnte ich durch die erste Liste iterieren und versuchen, ein Objekt in der zweiten Liste mit demselben Schlüssel zu suchen.

Wie klingt das? Gibt es einen besseren Weg, dies zu erreichen?

Alle Hilfe wird sehr geschätzt!

UPDATE:

Okay, also eigentlich brauche ich ein bisschen mehr. Wenn ich eine Übereinstimmung gefunden habe, möchte ich die Eigenschaften L1Obj.x, L1Obj.y, L1Obj.z mit denen von L2Obj überschreiben. HashSet hört sich toll an, wenn man nach Übereinstimmungen sucht, aber wenn ich recht habe, kann ich nicht auf diese Treffer zugreifen.

Was kann ich dagegen tun?

    
QuakerOat 15.02.2011, 23:39
quelle

5 Antworten

8

Machen die Objekte, die Sie betrachten wollen, die Implementierungen equals(Object) und hashCode() , die nur die Felder berücksichtigen, die Ihnen wichtig sind? Wenn dies der Fall ist, können Sie ein neues HashSet aus der ersten Liste erstellen und dann retainAll() in der zweiten Liste aufrufen.

Wenn sie equals(Object) und hashCode() nicht in Bezug auf die Eigenschaften implementieren, die Ihnen wichtig sind, können Sie eine TreeSet erstellen und eine Comparator übergeben, die die Eigenschaften berücksichtigt, die Ihnen wichtig sind.

    
ILMTitan 15.02.2011, 23:46
quelle
3

Verwenden Sie statt der String representation die Methode equals() und einen HashSet wie folgt:

%Vor%     
corsiKa 15.02.2011 23:46
quelle
1

Sie können eine Sache tun. Habe zwei Listen mit diesen Objekten und überschreibe die equals-Methode der Klasse, zu der diese Objekte gehören. Ihre Equals-Methode sollte wie folgt aussehen:

%Vor%

Denken Sie auch daran, sobald Sie die Methode equals überschreiben, müssen Sie auch die Methode int hashCode () überschreiben.

Beachten Sie, dass bei der Implementierung von hashCode () 2 gleiche Objekte den gleichen HashCode haben, während die Umkehrung nicht wahr ist.

    
Chander Shivdasani 15.02.2011 23:50
quelle
0

Ich weiß nicht, ob ich zu einfach denke, aber ich würde es so versuchen:

Überschreiben Sie die equals-Methode des Objekts, um Ihren Vergleich zu implementieren, um zu überprüfen, ob es sich um dasselbe Objekt handelt.

Dann würde ich über die erste Liste iterieren und mit der contains-Methode überprüfen, ob das Objekt auch in der zweiten Liste enthalten ist.

Dann würde ich die zweite Liste durchlaufen und prüfen, ob das Objekt auch in der ersten Liste und nicht schon in der Ergebnisliste ist.

    
anon 15.02.2011 23:44
quelle
0

Das fragliche Objekt sollte die Methode boolean equals(Object) implementieren. Zum Beispiel:

%Vor%

Sie könnten diese Methode überladen, damit Sie die gewünschten Gleichheitsoperationen implementieren können.

    
Weiser 15.02.2011 23:46
quelle