web-dev-qa-db-ger.com

Wie setze ich All auf Java hashMap-Inhalte von einem zum anderen, aber ersetze nicht vorhandene Schlüssel und Werte?

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);
76
rapadura

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);
102
erickson

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());
}
15
Tom Tresansky

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)

8
Reverend Gonzo

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.

5

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.

2
newday
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);
}}
2