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 a
Hashtable
. - Obtenga un iterador para el
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) basado en el valor. - Agregue la clase a un JPanel.
- Obtenga un
- Mostrar el panel.
El problema con esto es que no tengo control sobre el orden en que recupero los valores, por lo que no puedo mostrar los valores en un orden dado (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 dada, lo que no puedo hacer con un ArrayList
o Vector
.
¿Alguien sabe de una clase Java libre / de código abierto que haga esto, o una forma de obtener valores de un Hashtable
base en función de cuándo se agregaron?
¡Gracias!
java
dictionary
key-value
Shane
fuente
fuente
Respuestas:
Sugiero a
LinkedHashMap
o aTreeMap
. ALinkedHashMap
mantiene las claves en el orden en que se insertaron, mientras que aTreeMap
se mantiene ordenado a través de aComparator
o elComparable
ordenamiento natural de los elementos.Como no tiene que mantener los elementos ordenados,
LinkedHashMap
debería ser más rápido en la mayoría de los casos;TreeMap
tieneO(log n)
rendimiento paracontainsKey
,get
,put
, yremove
, de acuerdo con la Javadocs, mientras queLinkedHashMap
esO(1)
para cada uno.Si su API que solo espera un orden de clasificación predecible, a diferencia de un orden de clasificación específico, considere usar las interfaces que implementan estas dos clases,
NavigableMap
oSortedMap
. 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.fuente
LinkedHashMap devolverá los elementos en el orden en que se insertaron en el mapa cuando itera sobre keySet (), entrySet () o valores () del mapa.
Esto imprimirá los elementos en el orden en que se colocaron en el mapa:
fuente
Si un mapa inmutable se ajusta a sus necesidades, entonces hay una biblioteca de google llamada guava (vea también las preguntas sobre guayaba )
Guava proporciona un ImmutableMap con un orden de iteración confiable especificado por el usuario. Este ImmutableMap tiene un rendimiento O (1) para contieneKey, get. Obviamente, poner y quitar no son compatibles.
Los objetos ImmutableMap se construyen utilizando los elegantes métodos de conveniencia estática de () y copyOf () o un objeto Builder .
fuente
Puede mantener un
Map
(para una búsqueda rápida) yList
(para un pedido) pero aLinkedHashMap
puede ser el más simple. También puede probar unSortedMap
egTreeMap
, que tiene cualquier orden que especifique.fuente
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 1.5, por lo que es posible que desee 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 agregar.
fuente
Puedes probar mi implementación de Linked Tree Map .
fuente
Siempre que necesito mantener el orden natural de las cosas que se conocen con anticipación, uso un EnumMap
las claves serán enumeraciones y puede insertarlas en el orden que desee, pero cuando itera, iterará en el orden de enumeración (el orden natural).
Además, cuando se utiliza EnumMap no debe haber colisiones que puedan ser más eficientes.
Realmente encuentro que usar enumMap crea un código limpio y legible. Aquí hay un ejemplo
fuente
Puede usar LinkedHashMap para el orden de inserción principal en el Mapa
Los puntos importantes sobre la clase Java LinkedHashMap son:
Un LinkedHashMap contiene valores basados en la clave 3. Puede tener una clave nula y múltiples valores nulos. 4. Es lo mismo que HashMap en su lugar mantiene el orden de inserción
Pero si desea ordenar los valores en el mapa usando un objeto definido por el usuario o cualquier clave de tipo de datos primitiva, entonces debe usar TreeMap. Para obtener más información, consulte este enlace
fuente
Puede usar
LinkedHashMap<K, V>
o puede implementar su propio CustomMap que mantiene el orden de inserción.Puede usar el siguiente
CustomHashMap
con las siguientes características:null
No se permiten llaves con o cadenas vacías.HashMap
vsLinkedHashMap
vsCustomHashMap
Uso de
CustomHashMap
:O / P:
Si sabe que las CLAVES son fijas, puede usar EnumMap. Obtener los valores de las propiedades / archivos XML
EX:
fuente