implementar - recorrer hashmap java foreach
¿Clase de Java que implementa Map y mantiene el orden de inserción? (8)
Estoy buscando una clase en java que tenga asociación clave-valor, pero sin usar hashes. Esto es lo que estoy haciendo actualmente:
- Agrega valores a un
Hashtable
. - Obtenga un iterador para
Hashtable.entrySet()
. - Iterar a través de todos los valores y:
- Obtener un
Map.Entry
para el iterador. - Cree un objeto de tipo
Module
(una clase personalizada) basado en el valor. - Agrega la clase a un JPanel.
- Obtener un
- Mostrar el panel.
El problema con esto es que no tengo control sobre el orden en el que recupero los valores, por lo que no puedo mostrar los valores en un orden dado (sin codificar el orden).
ArrayList
un ArrayList
o Vector
para esto, pero más adelante en el código necesito agarrar el objeto Module
para una Clave dada, lo que no puedo hacer con un ArrayList
o Vector
.
¿Alguien sabe de una clase de Java libre / de código abierto que haga esto, o una forma de obtener valores de un Hashtable
basado en cuándo se agregaron?
¡Gracias!
Cuando necesito mantener el orden natural de las cosas que se conocen con anticipación, utilizo un EnumMap
Las claves serán enumeradas y se pueden insertar en el orden que desee, pero cuando se repita, se repetirá en el orden de enumeración (orden natural).
Además, cuando se utiliza EnumMap no debe haber colisiones, lo que puede ser más eficiente.
Realmente encuentro que el uso de enumMap hace que el código sea legible. Aquí hay un example
LinkedHashMap devolverá los elementos en el orden en que se insertaron en el mapa cuando repitas el conjunto de teclas (), entrySet () o los valores () 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
No sé si es de código abierto, pero después de buscar un poco en Google, encontré esta implementación de Map usando ArrayList . Parece ser Java anterior a la 1.5, por lo que es posible que desee generar un genérico, lo que debería ser fácil. Tenga en cuenta que esta implementación tiene acceso O (N), pero esto no debería ser un problema si no agrega cientos de widgets a su JPanel, que de todos modos no debería.
Podrías probar mi implementación de Linked Tree Map .
Puede mantener un Map
(para una búsqueda rápida) y una List
(para ordenar), pero un LinkedHashMap
puede ser el más simple. También puede probar un SortedMap
por ejemplo, TreeMap
, que tiene cualquier orden que especifique.
Puede usar LinkedHashMap para el orden de inserción principal en el Mapa
Los puntos importantes sobre la clase LinkedHashMap de Java son:
- Contiene elementos únicos únicos.
Un LinkedHashMap contiene valores basados en la clave 3. Puede tener una clave nula y varios valores nulos. 4.Es lo mismo que HashMap en cambio mantiene el orden de inserción
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
Pero si desea ordenar los valores en el mapa utilizando un objeto definido por el usuario o cualquier clave de tipo de datos primitivo, debe utilizar TreeMap. Para obtener más información, consulte este enlace.
Sugiero un LinkedHashMap
o un TreeMap
. Un LinkedHashMap
mantiene las claves en el orden en que se insertaron, mientras que un TreeMap
se mantiene ordenado a través de un Comparator
o el orden natural Comparable
de los elementos.
Como no tiene que mantener ordenados los elementos, LinkedHashMap
debería ser más rápido para la mayoría de los casos; TreeMap
tiene un TreeMap
O(log n)
para TreeMap
, get
, put
y remove
, según los Javadocs, mientras que LinkedHashMap
es O(1)
para cada uno.
Si su API que 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, SortedMap
o SortedMap
. Esto le permitirá no filtrar implementaciones específicas en su API y cambiar a cualquiera de esas clases específicas o una implementación completamente diferente a voluntad después.
Si un mapa inmutable se adapta a sus necesidades , hay una biblioteca de google llamada guava (consulte también las preguntas sobre guava )
guava proporciona un ImmutableMap con un orden confiable de iteración especificado por el usuario. Este ImmutableMap tiene un rendimiento de O (1) para contentsKey, get. Obviamente, poner y quitar no son compatibles.
ImmutableMap objetos ImmutableMap se construyen utilizando los elegantes métodos of() conveniencia estática of() y copyOf() o un objeto Builder .