Как putAll на Java hashMap содержимое одного на другое, но не заменяет существующие ключи и значения?
Мне нужно скопировать все ключи и значения из одной A HashMap на другую B, но не заменять существующие ключи и значения.
Каков наилучший способ сделать это?
Я думал, вместо этого повторяя keySet и checkig, если он существует или нет, я бы
Map temp = new HashMap(); // generic later
temp.putAll(Amap);
A.clear();
A.putAll(Bmap);
A.putAll(temp);
Ответы
Ответ 1
Похоже, вы готовы создать временный Map
, поэтому я бы сделал это следующим образом:
Map tmp = new HashMap(patch);
tmp.keySet().removeAll(target.keySet());
target.putAll(tmp);
Здесь patch
- это карта, которую вы добавляете к карте target
.
Благодаря Louis Wasserman, здесь версия, которая использует новые методы в Java 8:
patch.forEach(target::putIfAbsent);
Ответ 2
Использование Guava Maps class ' утилиты, чтобы вычислить разницу в 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());
}
Ответ 3
Просто повторите и добавьте:
for(Map.Entry e : a.entrySet())
if(!b.containsKey(e.getKey())
b.put(e.getKey(), e.getValue());
Изменить для добавления:
Если вы можете вносить изменения в a, вы также можете сделать:
a.putAll(b)
и у вас будет именно то, что вам нужно. (все записи в b
и все записи в a
, которые не находятся в b
)
Ответ 4
Вы можете сделать это всего за 1 строку, если вы измените порядок карт в решении @erickson:
mapWithNotSoImportantValues.putAll( mapWithImportantValues );
В этом случае вы заменяете значения в mapWithNotSoImportantValues со значением из mapWithImportantValues с теми же ключами.
Ответ 5
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);
}}
Ответ 6
С Java 8 этот метод API выполняет ваши требования.
map.putIfAbsent(key, value)
Если указанный ключ еще не связан со значением (или сопоставлен с нулем) связывает его с заданным значением и возвращает null, else возвращает текущее значение.