Muszę skopiować wszystkie klucze i wartości z jednego A HashMap do innego B, ale nie zastępować istniejących kluczy i wartości.
Jak najlepiej to zrobić?
Zamiast tego zastanawiałem się nad iteracją zestawu kluczy i sprawdzeniem, czy istnieje, czy nie
Map temp = new HashMap(); // generic later
temp.putAll(Amap);
A.clear();
A.putAll(Bmap);
A.putAll(temp);
removeAll
ponieważ i tak zostaną one zastąpione.patch.forEach(target::putIfAbsent)
.Korzystanie z guawy 's mapy metod klasy narzędzie do obliczania różnicy 2 mapach można to zrobić w jednej linii, metodą podpisu, co czyni go bardziej jasne, co chce się osiągnąć:
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()); }
źródło
Po prostu przeprowadź iterację i dodaj:
for(Map.Entry e : a.entrySet()) if(!b.containsKey(e.getKey()) b.put(e.getKey(), e.getValue());
Edytuj, aby dodać:
Jeśli możesz wprowadzić zmiany w a, możesz również:
a testament będzie miał dokładnie to, czego potrzebujesz. (wszystkie wpisy w
b
i wszystkie wpisya
, których nie mab
)źródło
entrySet()
zwraca aSet<Map.Entry>
. 2.) Nie ma metodycontains(...)
najava.util.Map
.Możesz to zrobić w zaledwie 1 linii, jeśli zmienisz kolejność map w rozwiązaniu @ erickson:
W tym przypadku zamieniasz wartości w mapWithNotSoImportantValues na wartość z mapWithImportantValues z tymi samymi kluczami.
źródło
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); }}
źródło
W Javie 8 istnieje metoda API, która spełnia Twoje wymagania.
Jeśli określony klucz nie jest już skojarzony z wartością (lub jest zamapowany na null), kojarzy go z daną wartością i zwraca null, w przeciwnym razie zwraca bieżącą wartość.
źródło
Jak powiedzieli inni, możesz użyć
putIfAbsent
. Powtórz każdy wpis na mapie, który chcesz wstawić, i wywołaj tę metodę na oryginalnej mapie:źródło