2012-01-17 12 views
14

Duplicar posibles:
Iterating through a LinkedHashMap in reverse order¿Cómo atravesar Linked Hash Map en reversa?

cómo atravesar Linked Hash Mapa en un orden inverso? ¿Hay algún método predefinido en el mapa para hacer eso?

estoy creando la siguiente manera:

LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer,String>(); 
map.put(1, "one"); 
map.put(2, "two"); 
map.put(3, "three"); 
+3

Ver http://stackoverflow.com/questions/7170871/iterating-through-a-linkedhashmap-in-reverse-order –

Respuesta

12
List<Entry<Integer,String>> list = new ArrayList<>(map.entries()); 

for(int i = list.size() -1; i >= 0 ; i --){ 
    Entry<Integer,String> entry = list.get(i); 
} 

No es muy bonito y en el costo de una copia del conjunto de entrada, que si su mapa tiene un número significativo de entradas podría ser una problema.

La excelente Guava library tienen una [List.reverse(List<>)][2] que permitirá utilizar el Java 5 para cada lazo de estilo más que el bucle indexada:

//using guava 
for(Entry entry : Lists.reverse(list)){ 
    // much nicer 
} 
18

probar esto, se imprimirá los teclas en orden de inserción inversa :

ListIterator<Integer> iter = 
    new ArrayList<>(map.keySet()).listIterator(map.size()); 

while (iter.hasPrevious()) { 
    Integer key = iter.previous(); 
    System.out.println(key); 
} 

también se pueden recorrer por el orden inverso al de la inserción entradas:

ListIterator<Map.Entry<Integer, String>> iter = 
    new ArrayList<>(map.entrySet()).listIterator(map.size()); 

while (iter.hasPrevious()) { 
    Map.Entry<Integer, String> entry = iter.previous(); 
    System.out.println(entry.getKey() + ":" + entry.getValue()); 
} 
+0

I don' Creo que esto funcionará cuando el iterador de la lista comience son el comienzo de la lista, así iter.hasPrevious() será falso en la primera llamada –

+3

@GarethDavis estás equivocado, el iterador de la lista anterior comienza en el _end_ de la lista - eso es lo que 'listIterator (map.size())' hace. –

+0

Aah veo, gracias. –

4

NORMAS Guayaba:

List<Object> reverseList = Lists.reverse(
     Lists.newArrayList(map.keySet())); 

Lists.reverse

Cuestiones relacionadas