¿Clase Java que implementa Map y mantiene el orden de inserción?

Resuelto Shane asked hace 15 años • 9 respuestas

Estoy buscando una clase en Java que tenga asociación clave-valor, pero sin usar hashes. Esto es lo que estoy haciendo actualmente:

  1. Agregar valores a un Hashtable.
  2. Obtenga un iterador para Hashtable.entrySet().
  3. Iterar a través de todos los valores y:
    1. Obtenga un Map.Entrypara el iterador.
    2. Cree un objeto de tipo Module(una clase personalizada) según el valor.
    3. Agregue la clase a un JPanel.
  4. Muestra el panel.

El problema con esto es que no tengo control sobre el orden en que obtengo los valores, por lo que no puedo mostrar los valores en un orden determinado (sin codificar el orden).

Usaría un ArrayListo Vectorpara esto, pero más adelante en el código necesito tomar el Moduleobjeto para una clave determinada, lo cual no puedo hacer con un ArrayListo Vector.

¿Alguien conoce una clase Java gratuita/de código abierto que haga esto, o una forma de obtener valores de a Hashtableen función de cuándo se agregaron?

¡Gracias!

Shane avatar Mar 26 '09 04:03 Shane
Aceptado

Sugiero un LinkedHashMapo un TreeMap. A LinkedHashMapmantiene las claves en el orden en que se insertaron, mientras que a TreeMapse mantiene ordenadas mediante a Comparatoro el orden natural Comparablede las claves.

Dado que no es necesario mantener los elementos ordenados, LinkedHashMapdebería ser más rápido en la mayoría de los casos; TreeMaptiene O(log n)rendimiento para containsKey, get, puty remove, según los Javadocs, mientras que LinkedHashMapes O(1)para cada uno.

Si su API solo espera un orden de clasificación predecible, en lugar de un orden de clasificación específico, considere usar las interfaces que implementan estas dos clases, NavigableMapo SortedMap. Esto le permitirá no filtrar implementaciones específicas en su API y luego cambiar a cualquiera de esas clases específicas o a una implementación completamente diferente a voluntad.

Michael Myers avatar Mar 25 '2009 21:03 Michael Myers

LinkedHashMap devolverá los elementos en el orden en que se insertaron en el mapa cuando itera sobre keySet(), EntrySet() o Values() del mapa.

Map<String, String> map = new LinkedHashMap<String, String>();

map.put("id", "1");
map.put("name", "rohan");
map.put("age", "26");

for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println(entry.getKey() + " = " + entry.getValue());
}

Esto imprimirá los elementos en el orden en que fueron colocados en el mapa:

id = 1
name = rohan 
age = 26 
Praveen Kishor avatar May 08 '2017 21:05 Praveen Kishor

Si un mapa inmutable se adapta a sus necesidades , entonces hay una biblioteca de Google llamada guava (consulte también las preguntas sobre guava ).

Guava proporciona un ImmutableMap con un orden de iteración confiable especificado por el usuario. Este ImmutableMap tiene un rendimiento O(1) para containsKey, get. Obviamente no se admiten poner y quitar.

Los objetos ImmutableMap se construyen utilizando los elegantes métodos estáticos de conveniencia de() y copyOf() o un objeto Builder .

jvdneste avatar Aug 27 '2010 15:08 jvdneste