Ich habe zwei HashMap
Objekte wie folgt definiert:
HashMap<String, Integer> map1 = new HashMap<String, Integer>();
HashMap<String, Integer> map2 = new HashMap<String, Integer>();
Ich habe auch ein drittes HashMap
Objekt:
HashMap<String, Integer> map3;
Wie kann ich fusionieren map1
und map2
gemeinsam in map3
?
Antworten:
quelle
Map
sind per Definition eindeutigWenn Sie wissen, dass Sie keine doppelten Schlüssel haben oder dass Werte für doppelte Schlüssel
map2
überschrieben werden sollenmap1
, können Sie einfach schreibenWenn Sie mehr Kontrolle darüber benötigen, wie Werte kombiniert werden, können Sie das
Map.merge
in Java 8 hinzugefügte verwenden, das einen vom Benutzer bereitgestelltenBiFunction
Wert zum Zusammenführen von Werten für doppelte Schlüssel verwendet.merge
arbeitet mit einzelnen Schlüsseln und Werten, daher müssen Sie eine Schleife oder verwendenMap.forEach
. Hier verketten wir Zeichenfolgen für doppelte Schlüssel:Wenn Sie wissen, dass Sie keine doppelten Schlüssel haben und diese erzwingen möchten, können Sie eine Zusammenführungsfunktion verwenden, die Folgendes auslöst
AssertionError
:Die Java 8-Streams-Bibliothek
toMap
undgroupingBy
Collectors bieten einen Schritt zurück von dieser speziellen Frage . Wenn Sie Karten wiederholt in einer Schleife zusammenführen, können Sie Ihre Berechnung möglicherweise so umstrukturieren, dass Streams verwendet werden. Dies kann sowohl Ihren Code verdeutlichen als auch eine einfache Parallelität mithilfe eines parallelen Streams und eines gleichzeitigen Kollektors ermöglichen.quelle
Einzeiler mit Java 8 Stream API:
Zu den Vorteilen dieser Methode gehört die Möglichkeit, eine Zusammenführungsfunktion zu übergeben, die sich mit Werten befasst, die denselben Schlüssel haben, zum Beispiel:
quelle
Java 8 alternativer Einzeiler zum Zusammenführen von zwei Karten:
Das gleiche gilt für die Methodenreferenz:
Oder idemponent für ursprüngliche Kartenlösung mit dritter Karte:
Und hier ist eine Möglichkeit, zwei Karten mit Guava zu einer schnell unveränderlichen zusammenzuführen , die am wenigsten mögliche Zwischenkopiervorgänge ausführt:
Siehe auch Zusammenführen von zwei Karten mit Java 8 für Fälle, in denen Werte, die in beiden Karten vorhanden sind, mit der Zuordnungsfunktion kombiniert werden müssen.
quelle
Wenn Sie für Ihre endgültige Karte keine Veränderlichkeit benötigen, gibt es Guavas
ImmutableMap
mit seinerBuilder
undputAll
-Methode, die im Gegensatz zur Java-Map
Schnittstellenmethode verkettet werden kann.Anwendungsbeispiel:
Natürlich kann diese Methode allgemeiner sein, Varargs und Loop verwenden, um
putAll
Maps
Argumente usw. zu verwenden, aber ich wollte ein Konzept zeigen.Außerdem
ImmutableMap
und esBuilder
gibt nur wenige Einschränkungen (oder vielleicht Funktionen?):NullPointerException
- wenn ein Schlüssel oder Wert in der Karte null ist)IllegalArgumentException
wenn doppelte Schlüssel hinzugefügt wurden).quelle
HashMap hat eine
putAll
Methode.http://download.oracle.com/javase/6/docs/api/java/util/HashMap.html
quelle
Sie könnten verwenden Collection.addAll () für andere Arten, zum Beispiel
List
,Set
usw.Map
, können Sie verwendenputAll
.quelle
Generische Lösung zum Kombinieren von zwei Karten, die möglicherweise gemeinsame Schlüssel haben können:
An Ort und Stelle:
Neue Karte zurückgeben:
quelle
Ein kleines Snippet, das ich sehr oft verwende, um Karten aus anderen Karten zu erstellen:
quelle
Sie können
HashMap<String, List<Integer>>
beide Hashmaps zusammenführen und vermeiden, dass Elemente verloren gehen, die mit demselben Schlüssel gepaart sind.Ausgabe:
quelle
Sehr spät, aber lassen Sie mich mitteilen, was ich getan habe, als ich das gleiche Problem hatte.
Es gibt die folgende Ausgabe
quelle
Doppelte Elemente werden nicht hinzugefügt (dh doppelte Schlüssel), da beim Drucken von hs3 nur ein Wert für Schlüssel 5 angezeigt wird, der die letzte Wertschöpfung darstellt und eine Ratte ist. ** [Set hat die Eigenschaft, den doppelten Schlüssel nicht zuzulassen, aber Werte können doppelt vorhanden sein]
quelle
Methode 1: Karten in eine Liste einfügen und dann beitreten
Methode 2: Normale Kartenzusammenführung
quelle
Sie können die Funktion putAll für Map verwenden, wie im folgenden Code erläutert
quelle
Das folgende Snippet nimmt mehr als eine Karte und kombiniert sie.
Demo Beispiel Link.
quelle
Sie können die Methode - addAll verwenden
http://download.oracle.com/javase/6/docs/api/java/util/HashMap.html
Es gibt jedoch immer das Problem, dass - wenn Ihre beiden Hash-Maps einen gleichen Schlüssel haben - der Wert des Schlüssels aus der ersten Hash-Map mit dem Wert des Schlüssels aus der zweiten Hash-Map überschrieben wird.
Um auf der sicheren Seite zu sein - ändern Sie die Schlüsselwerte - Sie können Präfix oder Suffix für die Schlüssel verwenden - (anderes Präfix / Suffix für die erste Hash-Map und anderes Präfix / Suffix für die zweite Hash-Map)
quelle