¿Clase Java que implementa Map y mantiene el orden de inserción?
Estoy buscando una clase en Java que tenga asociación clave-valor, pero sin usar hashes. Esto es lo que estoy haciendo actualmente:
- Agregar valores a un
Hashtable
. - Obtenga un iterador para
Hashtable.entrySet()
. - Iterar a través de todos los valores y:
- Obtenga un
Map.Entry
para el iterador. - Cree un objeto de tipo
Module
(una clase personalizada) según el valor. - Agregue la clase a un JPanel.
- Obtenga un
- 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 ArrayList
o Vector
para esto, pero más adelante en el código necesito tomar el Module
objeto para una clave determinada, lo cual no puedo hacer con un ArrayList
o Vector
.
¿Alguien conoce una clase Java gratuita/de código abierto que haga esto, o una forma de obtener valores de a Hashtable
en función de cuándo se agregaron?
¡Gracias!
Sugiero un LinkedHashMap
o un TreeMap
. A LinkedHashMap
mantiene las claves en el orden en que se insertaron, mientras que a TreeMap
se mantiene ordenadas mediante a Comparator
o el orden natural Comparable
de las claves.
Dado que no es necesario mantener los elementos ordenados, LinkedHashMap
debería ser más rápido en la mayoría de los casos; TreeMap
tiene O(log n)
rendimiento para containsKey
, get
, put
y remove
, según los Javadocs, mientras que LinkedHashMap
es 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, NavigableMap
o 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.
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
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 .