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





ejemplo recorrer (8)


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 .

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

  1. Agrega valores a un Hashtable .
  2. Obtenga un iterador para Hashtable.entrySet() .
  3. Iterar 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. Agrega la clase a un JPanel.
  4. 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!




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 



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.




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

Los puntos importantes sobre la clase LinkedHashMap de Java son:

  1. Contiene elementos únicos únicos.
  2. 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.




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




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.




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.




Ampliando en las otras respuestas, un par inmutable genérico debería tener un método estático para evitar saturar su código con la llamada al constructor:

class Pair<L,R> {
      final L left;
      final R right;

      public Pair(L left, R right) {
        this.left = left;
        this.right = right;
      }

      static <L,R> Pair<L,R> of(L left, R right){
          return new Pair<L,R>(left, right);
      }
}

Si nombra el método estático "of" o "pairOf", el código se vuelve fluido, ya que puede escribir:

    list.add(Pair.of(x,y)); // my preference
    list.add(pairOf(x,y)); // use with import static x.y.Pair.pairOf

Es una verdadera lástima que las bibliotecas principales de java sean tan escasas en tales cosas que tienes que usar commons-lang u otros terceros para hacer cosas tan básicas. Otra razón más para actualizar a Scala ...





java dictionary key-value