Мне нужно скопировать все ключи и значения из одного A HashMap в другой B, но не для замены существующих ключей и значений.
Как лучше всего это сделать?
Я думал вместо того, чтобы повторять keySet и проверять, существует он или нет, я бы
Map temp = new HashMap(); // generic later
temp.putAll(Amap);
A.clear();
A.putAll(Bmap);
A.putAll(temp);
removeAll
так как они все равно будут отменены.patch.forEach(target::putIfAbsent)
.Использование гуавы «s карт класса» служебные методы для вычисления разницы 2 карты вы можете сделать это в одной строке, с помощью метода подписи , что делает его более ясным , что вы пытаетесь достичь:
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()); }
источник
Просто повторите и добавьте:
for(Map.Entry e : a.entrySet()) if(!b.containsKey(e.getKey()) b.put(e.getKey(), e.getValue());
Отредактируйте, чтобы добавить:
Если вы можете внести изменения в a, вы также можете:
и у вас будет именно то, что вам нужно. (все записи в
b
и все записиa
, которых нетb
)источник
entrySet()
возвращает aSet<Map.Entry>
. 2.) Нет методаcontains(...)
дляjava.util.Map
.Вы можете сделать это всего в одной строке, если измените порядок карт в решении @ erickson:
В этом случае вы заменяете значения в mapWithNotSoImportantValues на значение из mapWithImportantValues с теми же ключами.
источник
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); }}
источник
В Java 8 есть этот метод API для выполнения ваших требований.
Если указанный ключ еще не связан со значением (или сопоставлен с нулевым значением), связывает его с заданным значением и возвращает null, иначе возвращает текущее значение.
источник
Как говорили другие, вы можете использовать
putIfAbsent
. Выполните итерации по каждой записи на карте, которую вы хотите вставить, и вызовите этот метод на исходной карте:источник