2009-03-19 30 views
238

En Java, ¿hay algún objeto que actúe como un Mapa para almacenar y acceder a pares clave/valor, pero puede devolver una lista ordenada de claves y una lista ordenada de valores, de modo que la clave y las listas de valores sean ¿en el mismo orden?Java Ordered Map

Así como explicación por código, yo estoy buscando algo que se comporta como mi OrderedMap ficticia:

OrderedMap<Integer, String> om = new OrderedMap<>(); 
om.put(0, "Zero"); 
om.put(7, "Seven"); 

String o = om.get(7); // o is "Seven" 
List<Integer> keys = om.getKeys(); 
List<String> values = om.getValues(); 

for(int i = 0; i < keys.size(); i++) 
{ 
    Integer key = keys.get(i); 
    String value = values.get(i); 
    Assert(om.get(key) == value); 
} 
+4

Si todo lo que quiere hacer es iterar a través de ambos al mismo tiempo, Map.entrySet() le permitirá hacer eso en cualquier mapa. El LinkedHashMap tiene un orden bien definido, pero para cualquier Map el conjunto de entrada refleja los pares clave/valor. –

+4

Este código no es un buen ejemplo ya que cualquier implementación de Map se comportará como su código de muestra. ordenado, ordenado o no. –

+0

Peter Lawrey: ¿Podrías ampliar eso? La interfaz de Mapa devuelve claves y valores como Conjunto y Colección, respectivamente. No se garantiza el orden en ninguno de estos, por lo que no parece sensato decir que todas las implementaciones de Map se comportarán como en mi código de ejemplo. – Whatsit

Respuesta

306

El SortedMap interfaz (con la aplicación TreeMap) debe ser su amigo.

La interfaz tiene los métodos:

  • keySet() que devuelve un conjunto de las teclas en orden ascendente
  • values() que devuelve una colección de todos los valores en el orden ascendente de las teclas correspondientes

Esta interfaz cumple exactamente sus requisitos. Sin embargo, las claves deben tener un orden significativo. De lo contrario, puede usar el LinkedHashMap donde el orden de inserción determina la orden.

+1

ejemplo: SortedMap map = new TreeMap <>(); – Ben

+5

Para usar TreeMap se requiere que la clase de clave tenga que implementar una interfaz comparable. Si no, se lanzará algún tipo de RuntimeException. TreeMap también es un mapa ordenado, pero creo que el autor desea utilizar el mapa ordenado (no ordenado). LinkedHashMap es una buena opción para obtener solo el mapa ordenado (como dijiste, "determinado por el orden de inserción"). –

162

¿Hay un objeto que actúa como un mapa para almacenar y acceder clave/valor pares, pero puede devolver una lista ordenada de claves y una lista ordenada de valores, de modo que la clave y las listas de valores estén en el mismo orden?

Está buscando java.util.LinkedHashMap. Obtendrá una lista de Map.Entry<K,V> pares, que siempre se repiten en el mismo orden. Ese orden es el mismo que el orden en el que coloca los artículos. Alternativamente, use el java.util.SortedMap, donde las claves deben tener un pedido natural o tenerlo especificado por un Comparator.

+10

Y para simplemente guardar al lector comprobando esto dos veces, porque es difícil de verificar mediante pruebas, el 'keySet El método() 'devuelve efectivamente un LinkedHashSet que refleja el orden de sus llamadas' put() '. Tenga en cuenta que las llamadas repetidas a 'put()' para la misma clave no cambiarán el orden a menos que 'quite()' la clave de antemano. –

6

creo que la colección que más se aproxima a partir del marco es la SortedMap

+3

Quisiera votar esta respuesta si pensé que valía la pena perder los puntos por ello. Como se señala en la respuesta anterior, su respuesta carece de la información adecuada sobre LinkedHashMap, y una pequeña explicación de SortedMap también sería agradable. – CorayThan

+0

@CorayThan, en ese caso votaste las mejores respuestas, no menosprecias otras que pueden ser correctas pero no las mejores ... –

+1

Eso es lo que hice. Solo digo que puedo entender por qué alguien podría votar por él. – CorayThan

3

Puede aprovechar la interfaz NavigableMap que se puede acceder y recorrer en orden ascendente o descendente. Esta interfaz es intended to supersede la interfaz SortedMap. El mapa navegable normalmente se ordena de acuerdo con el orden natural de sus claves, o mediante un comparador provisto en el momento de creación del mapa.

Existen tres implementaciones más útiles: TreeMap, ImmutableSortedMap y ConcurrentSkipListMap.

ejemplo TreeMap:

TreeMap<String, Integer> users = new TreeMap<String, Integer>(); 
users.put("Bob", 1); 
users.put("Alice", 2); 
users.put("John", 3); 

for (String key: users.keySet()) { 
    System.out.println(key + " (ID = "+ users.get(key) + ")"); 
} 

Salida:

Alice (ID = 2) 
Bob (ID = 1) 
John (ID = 3) 
13

LinkedHashMap mantiene el orden de las claves.

java.util.LinkedHashMap parece funcionar de la misma forma que un HashMap normal.

+0

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar aclaraciones de un autor, deje un comentario debajo de su publicación; siempre puede comentar sus propias publicaciones, y una vez que tenga suficiente [reputación] (http://stackoverflow.com/help/whats-reputation) lo hará poder [comentar cualquier publicación] (http://stackoverflow.com/help/privileges/comment). – ianaya89

+1

@ ianaya89 Creo que esta es una respuesta real, pero es muy similar a la respuesta [de John Feminella] (http://stackoverflow.com/a/663388/1677209). – T30

+0

Si desea obtener un mapa ordenado, donde las entradas se almacenan en ese orden cuando las coloca en el mapa, entonces LinkedHashMap es la respuesta correcta. Si desea ordenar las entradas en su mapa de forma independiente del orden en que las ingresó, entonces SortedMap es la respuesta correcta. – Ralph