Eu tenho dois HashMap
objetos definidos assim:
HashMap<String, Integer> map1 = new HashMap<String, Integer>();
HashMap<String, Integer> map2 = new HashMap<String, Integer>();
Eu também tenho um terceiro HashMap
objeto:
HashMap<String, Integer> map3;
Como posso mesclar map1
e map2
juntar map3
?
Respostas:
fonte
Map
são, por definição, exclusivasSe você sabe que não possui chaves duplicadas ou deseja que os valores
map2
substituam os valores dasmap1
chaves duplicadas, basta escreverSe você precisar de mais controle sobre como os valores são combinados, poderá usar
Map.merge
, incluído no Java 8, que usa um fornecido pelo usuárioBiFunction
para mesclar valores para chaves duplicadas.merge
opera com chaves e valores individuais; portanto, você precisará usar um loop ouMap.forEach
. Aqui concatenamos cadeias de caracteres para chaves duplicadas:Se você sabe que não possui chaves duplicadas e deseja aplicá-las, você pode usar uma função de mesclagem que gera um
AssertionError
:Retrocedendo nesta questão específica, a biblioteca de fluxos Java 8 fornece
toMap
egroupingBy
Collectors . Se você mesclar mapas repetidamente em um loop, poderá reestruturar sua computação para usar fluxos, o que pode esclarecer seu código e facilitar o paralelismo fácil usando um fluxo paralelo e um coletor simultâneo.fonte
Linha única usando a API Java 8 Stream:
Entre os benefícios desse método está a capacidade de passar uma função de mesclagem, que lida com valores que possuem a mesma chave, por exemplo:
fonte
Uma linha alternativa Java 8 para mesclar dois mapas:
O mesmo com a referência do método:
Ou idemponente para a solução de mapas originais com o terceiro mapa:
E aqui está uma maneira de mesclar dois mapas em um rápido e imutável com o Guava, que realiza menos operações de cópia intermediária possíveis:
Consulte também Mesclar dois mapas com Java 8 para casos em que os valores presentes nos dois mapas precisam ser combinados com a função de mapeamento.
fonte
Se você não precisa de mutabilidade para o seu mapa final, existem Guava's
ImmutableMap
com itsBuilder
eputAll
method que, ao contrário doMap
método de interface do Java , podem ser encadeados.Exemplo de uso:
Obviamente, esse método pode ser mais genérico, usar varargs e loop para
putAll
Maps
argumentos etc., mas eu queria mostrar um conceito.Além disso,
ImmutableMap
eBuilder
tem poucas limitações (ou talvez recursos?):NullPointerException
- se qualquer chave ou valor no mapa for nulo)IllegalArgumentException
se chaves duplicadas foram adicionadas).fonte
HashMap tem um
putAll
métodohttp://download.oracle.com/javase/6/docs/api/java/util/HashMap.html
fonte
Você poderia usar Collection.addAll () para outros tipos, por exemplo
List
,Set
, etc. PorMap
, você pode usarputAll
.fonte
Solução genérica para combinar dois mapas que podem compartilhar chaves comuns:
No lugar:
Retornando um novo mapa:
fonte
Um pequeno trecho usado com frequência para criar mapa a partir de outros mapas:
fonte
você pode usar
HashMap<String, List<Integer>>
para mesclar os dois hashmaps e evitar a perda de elementos emparelhados com a mesma chave.resultado:
fonte
Muito tarde, mas deixe-me compartilhar o que fiz quando tive o mesmo problema.
Dá a seguinte saída
fonte
Itens duplicados não serão adicionados (ou seja, chaves duplicadas); quando imprimirmos hs3, obteremos apenas um valor para a chave 5, que será o último valor adicionado e será rat. ** [O conjunto possui uma propriedade de não permitir a chave duplicada, mas os valores podem ser duplicados]
fonte
Método 1: Coloque mapas em uma lista e depois ingresse
Método 2: mesclagem de mapa normal
fonte
Você pode usar a função putAll para o mapa, conforme explicado no código abaixo
fonte
O snippet abaixo pega mais de um mapa e combina-os.
Link de exemplo de demonstração .
fonte
você pode usar - método addAll
http://download.oracle.com/javase/6/docs/api/java/util/HashMap.html
Mas sempre há esse problema que - se seus dois mapas de hash tiverem uma chave igual -, ele substituirá o valor da chave do primeiro mapa de hash pelo valor da chave do segundo mapa de hash.
Por estar do lado mais seguro - altere os valores das chaves - você pode usar prefixo ou sufixo nas chaves - (prefixo / sufixo diferente para o primeiro mapa de hash e prefixo / sufixo diferente para o segundo mapa de hash)
fonte