Tengo dos HashMap
objetos definidos así:
HashMap<String, Integer> map1 = new HashMap<String, Integer>();
HashMap<String, Integer> map2 = new HashMap<String, Integer>();
También tengo un tercer HashMap
objeto:
HashMap<String, Integer> map3;
¿Cómo puedo fusionarme map1
y map2
unirme map3
?
Respuestas:
fuente
Map
son por definición únicasSi sabe que no tiene claves duplicadas, o si desea que los valores
map2
sobrescriban los valores demap1
claves duplicadas, simplemente puede escribirSi necesita más control sobre cómo se combinan los valores, puede usarlos
Map.merge
, agregados en Java 8, que usa un valor proporcionado por el usuarioBiFunction
para fusionar valores para claves duplicadas.merge
opera en claves y valores individuales, por lo que deberá usar un bucle oMap.forEach
. Aquí concatenamos cadenas para claves duplicadas:Si sabe que no tiene claves duplicadas y desea aplicarlas, puede usar una función de combinación que arroje un
AssertionError
:Dando un paso atrás de esta pregunta específica, la biblioteca de secuencias de Java 8 proporciona
toMap
ygroupingBy
recopiladores . Si fusiona mapas repetidamente en un bucle, es posible que pueda reestructurar su cálculo para usar flujos, lo que puede aclarar su código y permitir un paralelismo fácil usando un flujo paralelo y un colector concurrente.fuente
One-liner utilizando Java 8 Stream API:
Entre los beneficios de este método está la capacidad de pasar una función de fusión, que tratará con valores que tienen la misma clave, por ejemplo:
fuente
Java 8 alternativo de una sola línea para fusionar dos mapas:
Lo mismo con la referencia del método:
O idemponente para la solución de mapas original con el tercer mapa:
Y aquí hay una manera de fusionar dos mapas en uno rápido e inmutable con Guava que realiza las operaciones de copia intermedia menos posibles:
Consulte también Combinar dos mapas con Java 8 para ver los casos en que los valores presentes en ambos mapas deben combinarse con la función de mapeo.
fuente
Si no necesita mutabilidad para su mapa final, está Guava's
ImmutableMap
con su métodoBuilder
y que, en contraste con el método de interfaz de Java , puede encadenarse.putAll
Map
Ejemplo de uso:
Por supuesto, este método puede ser más genérico, usar varargs y bucles a
putAll
Maps
partir de argumentos, etc., pero quería mostrar un concepto.Además,
ImmutableMap
yBuilder
tiene pocas limitaciones (¿o quizás características?):NullPointerException
- si alguna clave o valor en el mapa es nulo)IllegalArgumentException
si se agregaron claves duplicadas).fuente
HashMap tiene un
putAll
método.http://download.oracle.com/javase/6/docs/api/java/util/HashMap.html
fuente
Se podría utilizar Collection.addAll () para otros tipos, por ejemplo
List
,Set
, etc. ParaMap
, se puede utilizarputAll
.fuente
Solución genérica para combinar dos mapas que posiblemente puedan compartir claves comunes:
En su lugar:
Devolviendo un nuevo mapa:
fuente
Un pequeño fragmento que uso muy a menudo para crear mapas a partir de otros mapas:
fuente
puede usar
HashMap<String, List<Integer>>
para combinar ambos hashmaps y evitar perder elementos emparejados con la misma clave.salida:
fuente
Muy tarde, pero déjenme compartir lo que hice cuando tuve el mismo problema.
Da el siguiente resultado
fuente
No se agregarán elementos duplicados (es decir, claves duplicadas) ya que cuando imprimiremos hs3 obtendremos solo un valor para la clave 5, que será el último valor agregado y será rat. ** [Set tiene la propiedad de no permitir la clave duplicada pero los valores pueden duplicarse]
fuente
Método 1: poner mapas en una lista y luego unirse
Método 2: fusión de mapa normal
fuente
Puede usar la función putAll para Map como se explica en el siguiente código
fuente
El siguiente fragmento toma más de un mapa y los combina.
Enlace de ejemplo de demostración .
fuente
puedes usar - método addAll
http://download.oracle.com/javase/6/docs/api/java/util/HashMap.html
Pero siempre existe el problema de que, si sus dos mapas hash tienen alguna clave igual, entonces anulará el valor de la clave del primer mapa hash con el valor de la clave del segundo mapa hash.
Para estar en el lado más seguro, cambie los valores de las teclas, puede usar prefijo o sufijo en las teclas (diferentes prefijos / sufijos para el primer mapa hash y diferentes prefijos / sufijos para el segundo mapa hash)
fuente