Ich muss alle Schlüssel und Werte von einer A-HashMap auf eine andere B kopieren, aber vorhandene Schlüssel und Werte nicht ersetzen.
Wie geht das am besten?
Ich überlegte, stattdessen den KeySet zu iterieren und zu prüfen, ob er existiert oder nicht
Map temp = new HashMap(); // generic later
temp.putAll(Amap);
A.clear();
A.putAll(Bmap);
A.putAll(temp);
Es sieht so aus, als wären Sie bereit, ein temporäres Map
zu erstellen.
Map tmp = new HashMap(patch);
tmp.keySet().removeAll(target.keySet());
target.putAll(tmp);
Hier ist patch
die Karte, die Sie der target
Karte hinzufügen.
Dank Louis Wasserman, hier ist eine Version, die die neuen Methoden in Java 8:
patch.forEach(target::putIfAbsent);
Mit den Hilfsmethoden Guava 's Maps class' können Sie die Differenz von 2 Maps in einer einzelnen Zeile mit einer Methodensignatur berechnen, die Ihnen klarer macht, was Sie tun versuchen zu erreichen:
public static void main(final String[] args) {
// Create some maps
final Map<Integer, String> map1 = new HashMap<Integer, String>();
map1.put(1, "Hello");
map1.put(2, "There");
final Map<Integer, String> map2 = new HashMap<Integer, String>();
map2.put(2, "There");
map2.put(3, "is");
map2.put(4, "a");
map2.put(5, "bird");
// Add everything in map1 not in map2 to map2
map2.putAll(Maps.difference(map1, map2).entriesOnlyOnLeft());
}
Einfach iterieren und hinzufügen:
for(Map.Entry e : a.entrySet())
if(!b.containsKey(e.getKey())
b.put(e.getKey(), e.getValue());
Zum Hinzufügen bearbeiten:
Wenn Sie Änderungen an a vornehmen können, können Sie auch Folgendes tun:
a.putAll(b)
und a wird genau das haben, was du brauchst. (alle Einträge in b
und alle Einträge in a
, die sich nicht in b
befinden)
Sie können es in nur einer Zeile machen, wenn Sie die Kartenreihenfolge in @ ericksons Lösung ändern:
mapWithNotSoImportantValues.putAll( mapWithImportantValues );
In diesem Fall ersetzen Sie Werte in mapWithNotSoImportantValues durch Werte aus mapWithImportantValues mit denselben Schlüsseln.
Mit Java 8 gibt es diese API-Methode, um Ihre Anforderung zu erfüllen.
map.putIfAbsent(key, value)
Wenn der angegebene Schlüssel noch keinem Wert zugeordnet ist (oder null zugeordnet ist), wird er dem angegebenen Wert zugeordnet und null zurückgegeben, andernfalls wird der aktuelle Wert zurückgegeben.
public class MyMap {
public static void main(String[] args) {
Map<String, String> map1 = new HashMap<String, String>();
map1.put("key1", "value1");
map1.put("key2", "value2");
map1.put("key3", "value3");
map1.put(null, null);
Map<String, String> map2 = new HashMap<String, String>();
map2.put("key4", "value4");
map2.put("key5", "value5");
map2.put("key6", "value6");
map2.put("key3", "replaced-value-of-key3-in-map2");
// used only if map1 can be changes/updates with the same keys present in map2.
map1.putAll(map2);
// use below if you are not supposed to modify the map1.
for (Map.Entry e : map2.entrySet())
if (!map1.containsKey(e.getKey()))
map1.put(e.getKey().toString(), e.getValue().toString());
System.out.println(map1);
}}