Come mettere tutto su Java hashMap il contenuto di uno a altro, ma non sostituire le chiavi e i valori esistenti?

Ho bisogno di copiare tutte le chiavi e i valori da una HashMap a un’altra B, ma non a sostituire le chiavi e i valori esistenti.

Qual è il modo migliore per farlo?

Stavo pensando invece di iterare il tasto Set e controllare se esiste o no, lo farei

Map temp = new HashMap(); // generic later temp.putAll(Amap); A.clear(); A.putAll(Bmap); A.putAll(temp); 

Sembra che tu voglia creare una Map temporanea, quindi lo farei in questo modo:

 Map tmp = new HashMap(patch); tmp.keySet().removeAll(target.keySet()); target.putAll(tmp); 

Qui, patch è la mappa che stai aggiungendo alla mappa di target .

Grazie a Louis Wasserman, ecco una versione che sfrutta i nuovi metodi di Java 8:

 patch.forEach(target::putIfAbsent); 

Usando i metodi di utilità della class Maps di Guava per calcolare la differenza di 2 mappe, puoi farlo in una singola riga, con una firma del metodo che rende più chiaro ciò che stai cercando di realizzare:

 public static void main(final String[] args) { // Create some maps final Map map1 = new HashMap(); map1.put(1, "Hello"); map1.put(2, "There"); final Map map2 = new HashMap(); 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()); } 

Basta ripetere e aggiungere:

 for(Map.Entry e : a.entrySet()) if(!b.containsKey(e.getKey()) b.put(e.getKey(), e.getValue()); 

Modifica per aggiungere:

Se puoi apportare modifiche a, puoi anche fare:

 a.putAll(b) 

e avrà esattamente quello di cui hai bisogno. (tutte le voci in b e tutte le voci in a che non sono in b )

Puoi farlo in una sola riga se cambi l’ordine delle mappe nella soluzione di @ erickson:

 mapWithNotSoImportantValues.putAll( mapWithImportantValues ); 

In questo caso si sostituiscono i valori in mapWithNotSoImportantValues ​​con valore da mapWithImportantValues ​​con le stesse chiavi.

 public class MyMap { public static void main(String[] args) { Map map1 = new HashMap(); map1.put("key1", "value1"); map1.put("key2", "value2"); map1.put("key3", "value3"); map1.put(null, null); Map map2 = new HashMap(); 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); }} 

Con Java 8 c’è questo metodo API per soddisfare i tuoi requisiti.

 map.putIfAbsent(key, value) 

Se la chiave specificata non è già associata a un valore (o è mappata a null) la associa al valore dato e restituisce null, altrimenti restituisce il valore corrente.