Pregunta

Busco una clase en Java que tiene asociación de clave-valor, pero sin utilizar los hashes. Esto es lo que estoy haciendo actualmente:

  1. Añadir valores a un Hashtable.
  2. Obtener un iterador para el Hashtable.entrySet().
  3. Iterar a través de todos los valores y:
    1. Obtener un Map.Entry para el repetidor.
    2. Crear un objeto de tipo Module (una clase personalizada) en función del valor.
    3. Añadir a la clase a un JPanel.
  4. Mostrar el panel.

El problema con esto es que no tengo control sobre el orden que consigo los valores de nuevo, así que no puedo mostrar los valores en el un orden dado (sin disco de codificación de la orden).

Me gustaría utilizar un ArrayList o Vector para esto, pero más adelante en el código que tenga que agarrar el objeto Module para una clave dada, que no puedo hacer con un ArrayList o Vector.

¿Alguien sabe de una clase Java / de código abierto que va a hacer esto, o una manera de obtener valores fuera de un Hashtable en función del momento en que se agregaron?

Gracias!

¿Fue útil?

Solución

LinkedHashMap o una TreeMap . A LinkedHashMap mantiene las claves en el orden en que se insertaron, mientras que un TreeMap se mantiene ordenada a través de un Comparator o el ordenamiento Comparable natural de los elementos.

Debido a que no tiene que mantener los elementos ordenados, LinkedHashMap debe ser más rápido para la mayoría de los casos; TreeMap tiene un rendimiento O(log n) para containsKey, get, put, y remove, según la Javadocs, mientras LinkedHashMap es O(1) para cada uno.

Si su API que sólo espera una orden predecible, a diferencia de un orden de clasificación específica, considere el uso de las interfaces de estas dos clases implementan, NavigableMap o SortedMap . Esto permitirá que no se escape implementaciones específicas en su API y cambiar a cualquiera de esas clases específicas o una aplicación completamente diferente a voluntad después.

Otros consejos

LinkedHashMap devolverá los elementos en el orden en que se insertan en el mapa cuando iterar sobre el conjunto de claves (), entrySet (o 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 se ponen en el mapa:

id = 1
name = rohan 
age = 26 

Si un mapa inmutable se adapte a sus necesidades a continuación, hay una biblioteca de Google llamado de guayaba (véase también )

Guava proporciona un ImmutableMap con orden de iteración especificada por el usuario fiable. Este ImmutableMap tiene O (1) rendimiento para containsKey, conseguir. Obviamente poner y quitar no son compatibles.

ImmutableMap objetos se construyen mediante el uso de cualquiera de los elegantes métodos de conveniencia estáticos de () y CopyOf () o un objeto constructor .

Puede mantener un Map (para búsqueda rápida) y List (por orden) sino un LinkedHashMap puede ser la más simple. También puede probar un ejemplo SortedMap TreeMap, que tienen un orden que especifique.

No sé si se trata de código abierto, pero después de un poco de google, encontré esta implementación del Mapa usando ArrayList . Parece ser pre-1.5 de Java, por lo que es posible que desee genericize, lo que debe ser fácil. Tenga en cuenta que esta aplicación tiene acceso a la periferia (N), pero esto no debería ser un problema si no se agrega cientos de widgets a sus JPanel, que usted no debe de todos modos.

Usted podría intentar mis Vinculado aplicación Mapa del árbol .

Cada vez que necesito para mantener el orden natural de las cosas que son conocidas de antemano, yo uso un EnumMap

Las llaves se enumeraciones y se puede insertar en cualquier orden que desee, pero cuando iterar que se repetirá en el orden de enumeración (el orden natural).

También al usar EnumMap no debe haber colisiones que pueden ser más eficientes.

Me parece que el uso enumMap lo convierte en un código legible limpio. He aquí un ejemplo

Puede utilizar LinkedHashMap a fin principal de inserción en mapa

Los puntos importantes acerca de la clase de Java LinkedHashMap son:

  1. Contiene elementos onlyunique.
  2. A LinkedHashMap contiene valores basada en la clave 3.It puede tener una clave nula y múltiples valores nulos. 4.It es el mismo que HashMap en lugar 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 usando el objeto definido por el usuario o cualquier tecla tipo de datos primitivo, entonces debería usar TreeMap Para obtener más información, consulte este enlace

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top