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