Wie zum Zusammenführen von zwei Listen von Objekten durch den Vergleich von Feld-Wert in der gegebenen Objekte in Java
Habe ich zwei Liste mit Objekten, und ich möchte Sie zu einer Einheit verschmelzen. die Objekte haben zwei Felder, "name" und "Wert". Für eine gegebene obj2 in liste2 , wenn wir eine übereinstimmung finden, der "name" - Feld von obj1 in Liste1 (obj1 von list1 und obj2 von liste2), dann verwenden wir den "Wert" von obj2 zu überschreiben obj1. wenn keine übereinstimmung gefunden wird, dann fügen wir obj2 auf "list1". Die endgültige Ausgabe wird aktualisiert werden list1.
Gibt es eine schnelle Möglichkeit, dies zu tun? Ich denken kann, ist die Verwendung von zwei for-Schleifen vergleichen Sie alle Objekte, die in beiden Listen
class NameValueObj{
String name;
String value;
}
List<NameValueObj> merge(List<NameValueObj> list1, List<NameValueObj> list2){
//I want to merge two list here
}
NameValueObj ist gegeben, so dass ich kann;t ändern Sie die Objekt-Quelle.
Hier ist mein Weg, es zu tun.
private List<Header> mergeHeaders(List<Header> defHeaders, List<Header> ovrdHeaders) {
List<Header> lFinal = defHeaders;
boolean foundMatch = false;
for (Header ovrdHeader : ovrdHeaders) {
foundMatch = false;
for (Header defHeader : defHeaders) {
if (defHeader.getName().equalsIgnoreCase(ovrdHeader.getName())) {
defHeader.setValue(ovrdHeader.getValue());
foundMatch = true;
break;
}
}
if(!foundMatch) {
lFinal.add(ovrdHeader);
}
}
return lFinal;
}
Header-name und Wert-Feld. Header hat eindeutigen Namen, die in einer übergebenen Liste.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Algorithmus ist
O(n*n)
(quadratisch).Können Sie es tun in
O(n)
(linear) über eine temporäreLinkedHashMap
:Beachten Sie, dass das Verhalten ist NICHT genau das gleiche Verhalten und Ihre Umsetzung.
Die Unterschiede sind:
Diese Implementierung liefert eine neue list-Instanz anstelle der Modifizierung der ersten Liste. IMO, es ist ein Vorteil, aber es hängt von Ihnen ab. Wenn nötig, können Sie ändern Sie die Liste wie folgt (obwohl ich nicht empfehlen):
Dieser Implementierung wird davon ausgegangen, dass header-Namen sind schon einzigartig (Fall Unempfindlich) in beide Listen, während Ihr nicht machen diese Annahme.
Wenn header-Namen sind nicht einzigartig, diese Umsetzung erhalten würde die letzten header aus der Liste 1 oder Liste 2.
Also, wenn Sie sehen, das große Effizienz-overhead Ihrem Weg auf der Suche nach einem bestimmten element in einer anderen Liste. So sollten Sie sich Fragen, wie können Sie effizient suchen für das Objekt in eine andere Liste?
HashMap sieht aus wie eine einfache Möglichkeit, um Ihre problem. Also, was Sie tun können, ist, Durchlaufen Sie Ihre erste Liste, und fügen Sie Namen als Schlüssel und den Wert als value in die map. Ebenso für die zweite Liste.
Nächsten Iteration durch das keyset der 1. Karte und die Suche nach entsprechenden Schlüssel name in der 2. Liste. Wenn gefunden, füge Sie als Wert in der 1. Liste.
Der große Nachteil hier ist die Verwendung zusätzlicher Datenstrukturen.
Ich zu lösen hatte ein ähnliches problem. In meinem Fall hatte ich zum erstellen von benutzerdefinierten Regeln für die Entscheidung, wenn die Hash-Tabelle bereits einen Gegenstand bei sich haben oder nicht. Hier ist meine endgültige Lösung:
Auxiliar-Klassen:
Mein letzten merge-Methode:
Beispiel:
Den
mergedList
im Beispiel: