У меня есть два HashMap
объекта, определенные так:
HashMap<String, Integer> map1 = new HashMap<String, Integer>();
HashMap<String, Integer> map2 = new HashMap<String, Integer>();
У меня тоже третий HashMap
объект:
HashMap<String, Integer> map3;
Как я могу слиться map1
и map2
объединиться в map3
?
Ответы:
источник
Map
по определению уникальныЕсли вы знаете, что у вас нет дубликатов ключей, или вы хотите, чтобы значения
map2
перезаписывали значенияmap1
для дубликатов ключей, вы можете просто написатьЕсли вам нужно больше контроля над тем, как комбинируются значения, вы можете использовать
Map.merge
, добавленный в Java 8, который использует предоставленный пользователемBiFunction
для объединения значений для дубликатов ключей.merge
работает с отдельными ключами и значениями, поэтому вам нужно использовать цикл илиMap.forEach
. Здесь мы объединяем строки для дубликатов ключей:Если вы знаете, что у вас нет дубликатов ключей и хотите применить их, вы можете использовать функцию слияния, которая выдает
AssertionError
:Отступив от этого конкретного вопроса, библиотека потоков Java 8 предоставляет
toMap
иgroupingBy
Collectors . Если вы многократно объединяете карты в цикле, вы можете реструктурировать свои вычисления, чтобы использовать потоки, которые могут как прояснить ваш код, так и обеспечить легкий параллелизм, используя параллельный поток и параллельный коллектор.источник
Однострочное использование Java 8 Stream API:
Среди преимуществ этого метода - возможность передавать функцию слияния, которая будет работать со значениями, имеющими один и тот же ключ, например:
источник
Java 8 альтернативный однострочный для объединения двух карт:
То же самое со ссылкой на метод:
Или идемпонент для решения оригинальной карты с третьей картой:
И вот способ объединить две карты в быструю неизменяемую с Гуавой, которая выполняет наименьшие возможные промежуточные операции копирования:
См. Также Объединение двух карт с Java 8 для случаев, когда значения, присутствующие в обеих картах, должны быть объединены с функцией отображения.
источник
Если вам не нужна изменчивость для вашей окончательной карты, есть Guava
ImmutableMap
с егоBuilder
иputAll
методом, который, в отличие от метода интерфейса JavaMap
, может быть связан.Пример использования:
Конечно, этот метод может быть более общим, использовать varargs и цикл для
putAll
Maps
аргументов и т. Д., Но я хотел показать концепцию.Кроме того,
ImmutableMap
и у негоBuilder
есть несколько ограничений (или, возможно, функции?):NullPointerException
- если какой-либо ключ или значение на карте равно нулю)IllegalArgumentException
если дубликаты ключей были добавлены).источник
HashMap имеет
putAll
метод.http://download.oracle.com/javase/6/docs/api/java/util/HashMap.html
источник
Вы можете использовать Collection.addAll () для других типов, например
List
,Set
и т. Д. ДляMap
, вы можете использоватьputAll
.источник
Общее решение для объединения двух карт, которые могут совместно использовать общие ключи:
На месте:
Возвращаем новую карту:
источник
Небольшой фрагмент, который я очень часто использую для создания карты из других карт:
источник
Вы можете использовать
HashMap<String, List<Integer>>
для объединения обоих хэш-карт и избежать потери элементов в паре с одним и тем же ключом.вывод:
источник
Очень поздно, но позвольте мне поделиться тем, что я сделал, когда у меня была такая же проблема.
Это дает следующий вывод
источник
Повторяющиеся элементы не будут добавлены (то есть дубликаты ключей), так как при печати hs3 мы получим только одно значение для ключа 5, которое будет последним добавленным значением, и это будет крыса. ** [Set имеет свойство не разрешать дубликат ключа, но значения могут быть дублированы]
источник
Способ 1: положить карты в список, а затем присоединиться
Способ 2: объединение карты нормалей
источник
Вы можете использовать функцию putAll для Map, как описано в коде ниже
источник
Ниже сниппет занимает более одной карты и объединяет их.
Демо пример ссылки.
источник
Вы можете использовать - метод addAll
http://download.oracle.com/javase/6/docs/api/java/util/HashMap.html
Но всегда есть проблема, что - если ваши две хэш-карты имеют одинаковый ключ - тогда он переопределит значение ключа из первой хеш-карты на значение ключа из второй хеш-карты.
Для большей безопасности - измените значения ключей - вы можете использовать префикс или суффикс на ключах - (другой префикс / суффикс для первой карты хэша и другой префикс / суффикс для второй карты хэша)
источник