Как поместить все содержимое Java hashMap из одного в другое, но не заменять существующие ключи и значения?


Мне нужно скопировать все ключи и значения из одного HashMap на другой B, но не заменять существующие ключи и значения.

Whats лучший способ сделать это?

Я думал вместо итерации набора ключей и проверить, если он существует или нет, я бы

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

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);
}}

С Java 8 существует этот метод API для выполнения вашего требования.

map.putIfAbsent(key, value)

если указанный ключ еще не связан со значением (или сопоставлен с null) связывает его с заданным значением и возвращает null, else возвращает текущее значение.