Как объединить или объединить две карты в Java

Изучите слияние двух хэш-карт в обоих случаях — игнорирование повторяющихся ключей(перезапись значения) или обработка повторяющихся ключей.

1. Объединить два HashMap, игнорируя повторяющиеся ключи

Это простое решение. Используйте метод firstMap.putAll(secondMap), который копирует все сопоставления из secondMap в firstMap.

Как мы знаем, hashmap не допускает дублирования ключей. Поэтому, когда мы объединяем карты таким образом, для дублирования ключей в firstMap значение перезаписывается значением для того же ключа в secondMap.

Давайте рассмотрим пример. В следующем примере обе карты имеют запись с ключом «4». После слияния в финальной карте мы имеем запись из второй карты.

//map 1HashMap<Integer, String> firstMap = new HashMap<>();firstMap.put(1, "A");firstMap.put(2, "B");firstMap.put(3, "C");firstMap.put(4, "D");//map 2HashMap<Integer, String> secondMap = new HashMap<>();secondMap.put(4, "F"); //It will replace D with FsecondMap.put(5, "G"); //A new pair to be added//Merge mapsfirstMap.putAll(secondMap);System.out.println(firstMap);

Вывод программы.

{1=A, 2=B, 3=C, 4=F, 5=G}

2. Объединить две карты, объединив значения для повторяющихся ключей

Если мы хотим обрабатывать случаи, когда в картах присутствуют дублирующиеся ключи, и мы не хотим терять данные для любой карты и для любого ключа. В этом случае мы можем воспользоваться помощью функции Map.merge(), добавленной в Java 8.

Функция merge() принимает 3 аргумента: ключ, значение и предоставленную пользователем BiFunction для объединения значений для повторяющихся ключей.

В нашем примере мы хотим добавить значения(из обеих карт) для дубликата ключа «4».

//map 1HashMap<Integer, String> firstMap = new HashMap<>();firstMap.put(1, "A");firstMap.put(2, "B");firstMap.put(3, "C");firstMap.put(4, "D");//map 2HashMap<Integer, String> secondMap = new HashMap<>();secondMap.put(4, "F"); //It will replace D with FsecondMap.put(5, "G"); //A new pair to be added//Merge mapssecondMap.forEach((key, value) -> firstMap.merge(key, value, String::concat));System.out.println(firstMap);

Вывод программы.

{1=A, 2=B, 3=C, 4=DF, 5=G}

Обратите внимание на значение ключа «4». В первой карте оно имело значение D, а во второй карте — F. В объединенной карте это объединенное значение как «DF».

Мы можем написать любую логику слияния в предоставленной BiFunction. Например, если мы хотим добавить значения и поставить между ними разделитель, то мы можем написать нашу собственную BiFunction

secondMap.forEach((key, value) -> firstMap.merge(key, value,(v1, v2) -> v1.equalsIgnoreCase(v2) ? v1 : v1 + "," + v2));

Теперь вывод представляет собой объединенное значение и разделитель между значениями D и F.

{1=A, 2=B, 3=C, 4=D,F, 5=G}

Исходный код на Github

Прокрутить вверх