2009-07-31 14 views
19

Me preguntaba si existe una clase que implemente las interfaces Map y List en Java.Implementación del mapa de listas ordenadas en Java

Tengo una estructura de datos que es principalmente un Map. Asigné cadenas (ID) al Image s. Pero en una parte específica de mi código, debo presentarle al usuario todos los IDed Images disponibles. La única manera de hacer que hasta el momento es la de escribir esto:

for (String id : myMap.keySet()) { 
    // get the image like this "myMap.get(id)" 
} 

Así que sería bueno tener una clase que implementa tanto Map y List así que podría escribir simplemente:

for (Image img : myMap) { 
    // the image is img 
} 

¿Hay alguien saber de tal implementación?

EDIT: Después de ver las respuestas (que son todas correctas, votada), ahora me doy cuenta de que también necesitaría que se ordenara el mapa. Cuando digo "ordenado", todo lo que quiero decir es que me gustaría que tuviera los valores en un orden específico, uno que yo podría modificar. Sé que esta no es la pregunta original, pero me acabo de dar cuenta de que lo necesito.

EDIT 2: Parece que estoy indeciso. Lo que necesito es un mapa ordenado, no uno ordenado. Perdón por la confusión, gente.

Respuesta

34

Si usted necesita sus artículos en un orden específico, LinkedHashMap es su amigo - que mantiene los artículos con el fin de inserción. TreeMap mantendrá sus elementos en un orden definido por un comparador que usted proporcione o por un método compareTo de la clave.

+0

gracias esto es exactamente lo que necesito. –

+0

sería bueno poder cambiar el orden de los artículos aunque :( –

+0

Creo que puede volver a poner el artículo al final del mapa quitándolo y poniéndolo de nuevo. – Rorick

19

Para obtener un mapa ordenado, consulte LinkedHashMap. Eso mantendrá sus claves en el orden de inserción.

Si usa SortedMap, mantendrá las claves en orden. (El TreeMap es la implementación más común).

Lo que puede usar es map.entrySet(). Eso le permitirá iterar sobre el conjunto de entradas de mapa.

Consulte javadoc para obtener un poco más de información.

+1

+1 corta y buena respuesta. – bastianneu

+0

gracias por la respuesta. por favor revisa mis ediciones ya que mi pregunta ha cambiado ligeramente. –

+0

Gracias. Por lo general, prefiero la brevedad sobre la prolijidad. – jjnguy

2

Esto le da una recopilación de los valores almacenados

myMap.values() 
+0

buena respuesta. por favor revisa mis ediciones ya que mi pregunta ha cambiado ligeramente. –

+0

Un HashMap producirá una colección de valores ordenados por hash, que generalmente no es lo que desea. Así que vaya con la respuesta de jinguy y use un TreeMap y luego llame a values ​​(). – Stroboskop

3

puede utilizar el método Map.values(), que devuelve un Collection.

+0

buena respuesta. por favor revisa mis ediciones ya que mi pregunta ha cambiado ligeramente. –

2

Prueba esto:

for (Image img : myMap.values()) { 
    // the image is img 
} 

Para ver mapa Ordenado en java.util.SortedMap implementaciones. java.util.TreeMap es la opción más frecuente. Si necesita una orden de iteración garantizada, puede probar java.util.LinkedHashMap. Ofrece iteración en el mismo orden en que colocas los elementos en el mapa. O, opcionalmente, en el último orden de acceso. Si desea mover la tecla (una vez añadida) al final del mapa, debe eliminarla explícitamente y volver a colocarla.

+0

buena respuesta. por favor revisa mis ediciones ya que mi pregunta ha cambiado ligeramente. –

0

puede utilizar un TreeMap se clasifica de acuerdo con el ordenamiento natural de sus teclas, o por un comparador proporcionado en tiempo de creación de mapa:

TreeMap<String, Image> mapByName = new TreeMap<String, Image>(new ByNameComparator()); 

donde ByNameComparator() es un comparador. Alternativamente, puede usar los valores() methond y ordenar utilizando Colecciones.sort():

Collection<Image> images = mapByName.values(); 
Collections.sort(images, new BySizeComparator()); 
7

Ya tiene un montón de respuestas prácticas. Pero respondiendo directamente a la pregunta ...

Estaba deambulando si hay una clase que implemente las interfaces de Mapa y Lista en Java.

... vale la pena mencionar que es simplemente imposible. remove(Object) método es el obstáculo.

En Map interfaz de su firma es:

V remove(Object key); 

Y en List interfaz es:

boolean remove(Object o); 
Cuestiones relacionadas