Quiero tener un mapa con claves duplicadas.
Sé que hay muchas implementaciones de mapas (Eclipse me muestra unas 50), así que apuesto a que debe haber una que lo permita. Sé que es fácil escribir tu propio mapa que haga esto, pero prefiero usar alguna solución existente.
¿Quizás algo en colecciones comunes o colecciones de Google?
java
duplicates
guava
multimap
IAdapter
fuente
fuente
Respuestas:
Está buscando un multimapa y, de hecho, tanto commons-collections como Guava tienen varias implementaciones para eso. Los multimapas permiten múltiples claves manteniendo una colección de valores por clave, es decir, puede poner un solo objeto en el mapa, pero recupera una colección.
Si puede usar Java 5, preferiría el de Guava,
Multimap
ya que es compatible con los genéricos.fuente
com.google.common.collect.HashMultimap
tienereadObject
/writeObject
métodos, al igual que ArrayListMultimap e Immutable {List, Set} Multimap. Consideraría una instancia deserializada inútil como un error que vale la pena informar.No necesitamos depender de la biblioteca externa de Colecciones de Google. Simplemente puede implementar el siguiente mapa:
Asegúrese de ajustar el código.
fuente
La salida es:
Nota: necesitamos importar archivos de biblioteca.
http://www.java2s.com/Code/Jar/g/Downloadgooglecollectionsjar.htm
o https://commons.apache.org/proper/commons-collections/download_collections.cgi
fuente
Simplemente podría pasar una matriz de valores para el valor en un HashMap normal, simulando así claves duplicadas, y dependería de usted decidir qué datos usar.
También puede usar un MultiMap , aunque a mí no me gusta la idea de duplicar claves.
fuente
TreeMap<String, ArrayList<MyClass>>
resolvió mis necesidades de claves duplicadas.Si desea iterar sobre una lista de pares clave-valor (como escribió en el comentario), entonces una Lista o una matriz deberían ser mejores. Primero combine sus claves y valores:
Reemplace Class1 y Class2 con los tipos que desea usar para claves y valores.
Ahora puede ponerlos en una matriz o lista e iterar sobre ellos:
fuente
Este problema se puede resolver con una lista de entradas de mapa
List<Map.Entry<K,V>>
. No necesitamos utilizar bibliotecas externas ni una nueva implementación de Map. Se puede crear una entrada de mapa como esta:Map.Entry<String, Integer> entry = new AbstractMap.SimpleEntry<String, Integer>("key", 1);
fuente
fuente
Aprenda de mis errores ... por favor, no implemente esto por su cuenta. El multimapa de guayaba es el camino a seguir.
Una mejora común requerida en multimaps es no permitir pares de claves-valor duplicados.
Implementar / cambiar esto en su implementación puede ser molesto.
En Guayaba es tan simple como:
fuente
Tenía una variante ligeramente diferente de este problema: era necesario asociar dos valores diferentes con la misma clave. Solo publíquelo aquí en caso de que ayude a otros, he introducido un HashMap como valor:
En el código anterior, el key frameID se lee de la primera cadena de un archivo de entrada en cada línea, el valor de frameTypeHash se construye dividiendo la línea restante y se almacenó como objeto String originalmente, durante un período de tiempo el archivo comenzó a tener varias líneas ( con diferentes valores) asociados con la misma clave frameID, por lo que frameTypeHash se sobrescribió con la última línea como valor. Reemplacé el objeto String con otro objeto HashMap como campo de valor, esto ayudó a mantener una clave única para la asignación de diferentes valores.
fuente
No se requieren bibliotecas sofisticadas. Los mapas están definidos por una clave única, así que no los doble, use una lista. Los arroyos son poderosos.
Y eso es. Ejemplos de uso:
fuente
fuente
java-map-duplicate-keys
fuente
¿Qué pasa con un impl MultiMap?
fuente
¿Podría también explicar el contexto para el que está intentando implementar un mapa con claves duplicadas? Estoy seguro de que podría haber una solución mejor. Los mapas están destinados a mantener claves únicas por una buena razón. Aunque si realmente quisieras hacerlo; siempre puede extender la clase para escribir una clase de mapa personalizada simple que tenga una función de mitigación de colisiones y le permita mantener múltiples entradas con las mismas claves.
Nota: Debe implementar la función de mitigación de colisiones de modo que las claves en colisión se conviertan en un conjunto único "siempre". ¿Algo simple como agregar la clave con el código hash del objeto o algo así?
fuente
solo para estar completo, Apache Commons Collections también tiene un MultiMap . La desventaja, por supuesto, es que Apache Commons no usa Generics.
fuente
Con un pequeño truco puedes usar HashSet con claves duplicadas. ADVERTENCIA: esto depende en gran medida de la implementación de HashSet.
fuente
Si hay claves duplicadas, una clave puede corresponder a más de un valor. La solución obvia es asignar la clave a una lista de estos valores.
Por ejemplo en Python:
fuente
Usé esto:
java.util.List<java.util.Map.Entry<String,Integer>> pairList= new java.util.ArrayList<>();
fuente