with repeated keys example java collections map hashtable multimap

repeated - Hashtable multivalor en Java



multimap java (13)

¿Es posible tener varios valores para la misma clave en una tabla hash? Si no es así, ¿puede sugerir alguna clase o interfaz que pueda usarse?


Además de Google Collections, hay un objeto de MultiMap para MultiMap


Código siguiente sin la biblioteca de guayaba de Google. Se utiliza para doble valor como clave y orden ordenado.

Map<Double,List<Object>> multiMap = new TreeMap<Double,List<Object>>(); for( int i= 0;i<15;i++) { List<Object> myClassList = multiMap.get((double)i); if(myClassList == null) { myClassList = new ArrayList<Object>(); multiMap.put((double) i,myClassList); } myClassList.add("Value "+ i); } List<Object> myClassList = multiMap.get((double)0); if(myClassList == null) { myClassList = new ArrayList<Object>(); multiMap.put( (double) 0,myClassList); } myClassList.add("Value Duplicate"); for (Map.Entry entry : multiMap.entrySet()) { System.out.println("Key = " + entry.getKey() + ", Value = " +entry.getValue()); }


Como otros señalaron, no. En su lugar, considere usar un Multimap que pueda asignar muchos valores para la misma clave.

La biblioteca de Google Collections ( actualización : Guava ) contiene una implementación y es probablemente su mejor apuesta.

Edición : por supuesto, puede hacer lo que Eric sugiere , y almacenar una Colección como un valor en su Hashtable (o Mapa, más generalmente), pero eso significa escribir usted mismo un código innecesario. Cuando use una biblioteca como Google Collections, se ocupará de la "plomería" de bajo nivel para usted. Echa un vistazo a este bonito ejemplo de cómo se simplificaría tu código mediante el uso de Multimap en lugar de las clases de colecciones Java de vainilla.


Consulte la Biblioteca de colecciones de Google para obtener información sobre multimapas y colecciones similares similares. Las colecciones incorporadas no tienen soporte directo para esto.


En lugar de dar otra respuesta de mapa múltiple, le preguntaré por qué quiere hacer esto.

¿Están relacionados los múltiples valores? Si es así, entonces probablemente sea mejor que cree una estructura de datos para mantenerlos. Si no, entonces quizás sea más apropiado usar mapas separados.

¿Los mantiene juntos para que pueda iterarlos según la clave? Es posible que desee buscar una estructura de datos de indexación alternativa, como un SkipList.


En una tabla hash, uno usaría un par clave / valor para almacenar información.

En Java, la clase Hashtable acepta un solo valor para una sola clave. El siguiente es un ejemplo de un intento de asociar varios valores a una sola clave:

Hashtable<String, String> ht = new Hashtable<String, String>(); ht.put("Answer", "42"); ht.put("Hello", "World"); // First value association for "Hello" key. ht.put("Hello", "Mom"); // Second value association for "Hello" key. for (Map.Entry<String, String> e : ht.entrySet()) { System.out.println(e); }

En un intento de incluir varios valores ( "World" , "Mom" ) en una sola clave ( "Hello" ), obtenemos el siguiente resultado para imprimir las entradas en la Hashtable :

Answer=42 Hello=Mom

El par clave / valor de "Hello" y "World" no está en el Hashtable , solo la segunda entrada "Hello" y " Mom " está en el Hashtable . Esto muestra que uno no puede tener varios valores asociados con una sola clave en un Hashtable .

Lo que realmente se necesita aquí es un multimap , que permite una asociación de múltiples valores a una sola clave.

Una implementación del multimap es Multimap de Google Collections :

Multimap<String, String> mm = HashMultimap.create(); mm.put("Answer", "42"); mm.put("Hello", "World"); mm.put("Hello", "Mom"); for (Map.Entry<String, String> e : mm.entries()) { System.out.println(e); }

Esto es similar al ejemplo anterior que usó Hashtable , pero el comportamiento es bastante diferente: un Multimap permite la asociación de múltiples valores a una sola clave. El resultado de ejecutar el código anterior es el siguiente:

Answer=42 Hello=Mom Hello=World

Como se puede ver, para la clave "Hello" , los valores de "Mom" y "World" asocian a ella. A diferencia de Hashtable , no descarta uno de los valores y lo reemplaza por otro. El Multimap puede mantener varios valores para cada tecla.


Lo que estás buscando es un Multimap . La API de Google Collections proporciona una buena implementación de esto y mucho más que vale la pena aprender a usar. ¡Muy recomendable!


Los valores de una tabla hash son Objeto para que pueda almacenar una Lista


Necesitas usar algo llamado MultiMap . Esto no es estrictamente un mapa, sin embargo, es una API diferente. Es aproximadamente lo mismo que un Mapa <K, Lista <V>>, pero no tendrá métodos como entrySet () o valores ().


Ninguna de las respuestas indicaba lo que haría primero.

El salto más grande que hice en mis habilidades de OO fue cuando decidí SIEMPRE hacer otra clase cuando parecía que podría ser incluso un poco útil, y esta es una de las cosas que aprendí siguiendo ese patrón.

Casi todo el tiempo, encuentro que hay una relación entre los objetos que trato de colocar en una tabla hash. La mayoría de las veces, hay espacio para una clase, incluso uno o dos métodos.

De hecho, a menudo encuentro que ni siquiera quiero una estructura de tipo HashMap, un simple HashSet funciona bien.

El elemento que está almacenando como clave principal puede convertirse en la identidad de un nuevo objeto, por lo que puede crear métodos de igual y hash que se refieran solo a ese objeto (eclipse puede hacer que sus métodos de igual y hash sean más fáciles). de esa manera el nuevo objeto guardará, ordenará y recuperará exactamente como lo hizo el original, luego usará las propiedades para almacenar el resto de los elementos.

La mayoría de las veces, cuando hago eso, encuentro que existen algunos métodos que van allí y, antes de darme cuenta, tengo un objeto completo que debería haber estado allí todo el tiempo pero nunca lo reconocí, y un montón de basura. factores fuera de mi código.

Para hacer que sea más un "Paso de bebé", a menudo creo la nueva clase contenida en mi clase original; a veces incluso contengo la clase dentro de un método si tiene sentido ubicarlo de esa manera, luego lo muevo. Alrededor a medida que se hace más claro que debería ser una clase de primera clase.


No. Esa es la idea de las tablas hash.

Sin embargo, puede rodar el suyo propio con un Map<YourKeyObject, List<YourValueObject>> y algunos métodos de utilidad para crear la lista si no está presente, o usar algo como el Multimap de Google Collections .

Ejemplo:

String key = "hello"; Multimap<String, Integer> myMap = HashMultimap.create(); myMap.put(key, 1); myMap.put(key, 5000); System.out.println(myMap.get(key)); // prints either "[1, 5000]" or "[5000, 1]" myMap = ArrayListMultimap.create(); myMap.put(key, 1); myMap.put(key, 5000); System.out.println(myMap.get(key)); // always prints "[1, 5000]"

Tenga en cuenta que Multimap no es un equivalente exacto de la solución casera; Hashtable sincroniza todos sus métodos, mientras que Multimap no ofrece dicha garantía. Esto significa que usar un Multimap puede causarle problemas si lo está utilizando en varios subprocesos . Si tu mapa se usa solo en un hilo, no hará ninguna diferencia (y deberías haber estado usando HashMap lugar de Hashtable todos modos).


Sencillo. En lugar de Hashtable<Key, Value> , use Hashtable<Key, Vector<Value>> .


Solo haz tu propio

Map<Object, List<Object>> multiMap = new HashMap<Object, List<Object>>();

Para añadir:

public void add(String key, Object o) { List<Object> list; if (multiMap.containsKey(key)) { list = multiMap.get(key); list.add(o); } else { list = new ArrayList<Object>(); list.add(o); multiMap.put(key, list); } }