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

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

  1. Agregue valores a una Hashtable .
  2. Obtenga un iterador para Hashtable.entrySet() .
  3. Itera a través de todos los valores y:
    1. Obtener un Map.Entry para el iterador.
    2. Cree un objeto de tipo Module (una clase personalizada) basado en el valor.
    3. Agregue la clase a un JPanel.
  4. 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 el orden dado (sin codificar el orden).

Yo usaría un ArrayList o Vector para esto, pero más adelante en el código necesito tomar el objeto Module para una Clave dada, lo que no puedo hacer con ArrayList o Vector .

¿Alguien sabe de una clase Java libre / de código abierto que hará esto, o una forma de obtener valores de una Hashtable función de cuándo se agregaron?

¡Gracias!

    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 los elementos ordenados, LinkedHashMap debería ser más rápido para la mayoría de los casos; TreeMap tiene un TreeMap O(log n) para containsKey , get , put y remove , según Javadocs, mientras que LinkedHashMap es O(1) para cada uno.

    Si su API solo espera un orden de clasificación predecible, a diferencia de un orden de clasificación específico, considere usar las interfaces implementadas por estas dos clases, SortedMap u 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 tus necesidades, entonces hay una biblioteca de google llamada guayaba (consulta también preguntas de guayaba )

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

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

    LinkedHashMap devolverá los elementos en el orden en que se insertaron en el mapa cuando itere sobre keySet (), entrySet () o values ​​() del mapa.

     Map map = new LinkedHashMap(); map.put("id", "1"); map.put("name", "rohan"); map.put("age", "26"); for (Map.Entry entry : map.entrySet()) { System.out.println(entry.getKey() + " = " + entry.getValue()); } 

    Esto imprimirá los elementos en el orden en que se colocaron en el mapa:

     id = 1 name = rohan age = 26 

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

    No sé si es de código abierto, pero después de un poco de búsqueda 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 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 .

    Cada vez que necesito mantener el orden natural de las cosas que se conocen de antemano, utilizo un EnumMap

    las claves serán enumeraciones y usted puede insertarlas en el orden que desee, pero cuando itere, repetirá en el orden enum (el orden natural).

    Además, al usar EnumMap, no debería haber colisiones que puedan ser más eficientes.

    Realmente encuentro que usar enumMap hace que el código sea legible y limpio. Aquí hay un ejemplo

    Puede usar LinkedHashMap para el orden de inserción principal en Mapa

    Los puntos importantes acerca de la clase Java LinkedHashMap son:

    1. Contiene solo elementos únicos.
    2. 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 cambio mantiene el orden de inserción

       public class LinkedHashMap extends HashMap implements Map 

    Pero si desea ordenar los valores en el mapa utilizando el objeto definido por el usuario o cualquier clave de tipo de datos primitivo, entonces debe usar TreeMap. Para obtener más información, consulte este enlace