Как поместить все содержимое Java hashMap из одного в другое, но не заменять существующие ключи и значения?
Мне нужно скопировать все ключи и значения из одного HashMap на другой B, но не заменять существующие ключи и значения.
Whats лучший способ сделать это?
Я думал вместо итерации набора ключей и проверить, если он существует или нет, я бы
Map temp = new HashMap(); // generic later
temp.putAll(Amap);
A.clear();
A.putAll(Bmap);
A.putAll(temp);
6 ответов:
похоже, вы готовы создать временную
Map
, Так что я бы сделал это так:Map tmp = new HashMap(patch); tmp.keySet().removeAll(target.keySet()); target.putAll(tmp);
здесь
patch
- Это карта, которую вы добавляете кtarget
карта.спасибо Луи Вассерман, вот версия, которая использует преимущества новых методов в Java 8:
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, вы также можете сделать:
a.putAll(b)
и будет именно то, что вам нужно. (все записи в
b
все записи вa
не вb
)
вы можете сделать это всего за 1 строку, если вы измените порядок карт в решении @erickson:
mapWithNotSoImportantValues.putAll( mapWithImportantValues );
в этом случае вы заменяете значения в 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); }}