2010-11-21 17 views
6

que tienen Hashmap¿Cómo la iteración es la última en HashMap?

items = new HashMap<String, String>(); 
     items.put("A", "1"); 
     items.put("B", "2"); 
     items.put("C", "3"); 

que necesito para cada último al primero.

"C", "3" 
"B", "2" 
"A", "1" 
+0

Los términos Último y Primero parecen denotar tiempo. La mayoría de las respuestas que veo asumen que el Último y el Primer son semánticos (por ejemplo, C es más grande que A y, por lo tanto, Última). OrderedMaps no lo ayudará si necesita ordenar el tiempo de inserción y no tiene la marca de tiempo de inserción en la clave. – extraneon

+1

'HashMap' no garantiza ningún orden para sus elementos. En particular, no garantiza que el orden se mantenga constante a lo largo del tiempo. Por lo tanto, 'HashMap' no es lo que quieres si tienes que mantener cualquier tipo de orden. – barjak

Respuesta

4

EDITAR: Yo y Matthew claramente tenemos diferentes interpretaciones de lo que significa su pregunta. ¿Te refieres al orden inverso que insertaste o al orden inverso de las teclas?

Si se refiere a orden de las claves inversa, aquí está cómo hacerlo:

utilizar un mapa ordenado, como TreeMap y luego iterar sobre items.keySet().

tipo TreeMap por orden natural de sus valores clave, por lo que tendrá que pasar en un comparador al constructor para ordenar las claves en orden inverso:

Map<String, String> items = new TreeMap<String, String>(new Comparator<String>() { 
    public int compare(String a, String b) { 
    return b.compareTo(a); 
    } 
}); 

items.put("A", "1"); 
items.put("B", "2"); 
items.put("C", "3"); 

for (String s: items.keySet()) { 
    System.out.println(s + " " + items.get(s)); 
} 
+3

Este código es equivalente: 'Map items = new TreeMap (Collections.reverseOrder());' – barjak

+0

Oh genial - no lo había visto antes de – iftheshoefritz

1

HashMap no garantiza cualquier pedido. Si usa LinkedHashMap, se ordenará por inserción, pero todavía no hay una manera conveniente de ir hacia atrás.

Una forma sería llamar al items.entrySet(). Eso devuelve un Set<Map.Entry>. A continuación, puede obtener el tamaño del conjunto, llame al toArray(), luego haga un ciclo descendente.

0

Otro método - crear un SortedSet de las llaves :

import java.util.*; 

class MyComparator implements Comparator<String> { 
    public int compare(String a, String b) { 
     return -a.compareTo(b); 
    } 

    public boolean equals(String a, String b) { 
     return a.equals(b); 
    } 
} 

public class test { 
    public static void main(String[] args) { 
     HashMap<String, String> items = new HashMap<String, String>(); 
     items.put("A", "1"); 
     items.put("B", "2"); 
     items.put("C", "3"); 

     TreeSet<String> ts = new TreeSet<String>(new MyComparator()); 
     ts.addAll(items.keySet()); 
     for(Iterator<String> i = ts.iterator(); i.hasNext();) { 
      String key = i.next(); 
      System.out.println("key: " + key + ", value: " + items.get(key)); 
     } 
    } 
} 

salida:

 
key: C, value: 3 
key: B, value: 2 
key: A, value: 1 
+0

Suponiendo que Last está en el contexto de la clave, pero creo que se refería al tiempo de inserción. Si el tiempo de inserción no está en la clave, un comparador no puede ayudarlo. – extraneon

+0

No estoy de acuerdo. No creo que el tiempo de inserción tenga algo que ver con eso. Creo que cometió el error de pensar que un HashMap podría repetirse en algún orden, y quiere que se revierta. Supongo que la orden que quería decir era alfabética. – sje397

6

Puede usar un NavigableMap (TreeMap es un NavigableMap), que es un SortedMap con capacidades de navegación.

NavigableMap#descendingMap() devuelve una vista de orden inverso (no una copia) de las asignaciones que figuran en este mapa.

Ejemplo:

NavigableMap<String, String> items = new TreeMap<String, String>(); 
items.put("B", "2"); 
items.put("A", "1"); 
items.put("C", "3"); 

for (Map.Entry<String, String> e : items.entrySet()) { 
    System.out.println(e); 
} 
// gives 
// A=1 
// B=2 
// C=3 

for (Map.Entry<String, String> e : items.descendingMap().entrySet()) { 
    System.out.println(e); 
} 

// gives 
// C=3 
// B=2 
// A=1 

Nota: Esta respuesta es válida si se preocupan por el ordenamiento natural de las claves en su Map. Si le importa el orden de inserción o el orden de acceso, eche un vistazo al LinkedHashMap.

Nota 2: En su pregunta, utilizó un HashMap. Tenga en cuenta que HashMap no garantiza ningún pedido para sus elementos. En realidad, ni siquiera garantiza que el orden se mantendrá constante a lo largo del tiempo. Consulte el primer párrafo de HashMap's javadoc para obtener más referencias.

+0

El orden se basa en semántica clave. Pero creo que la pregunta es sobre el tiempo de inserción. Por lo tanto, un orden inverso no lo ayudará, ya que el criterio de orden (tiempo de inserción) no es parte de la clave. – extraneon

+0

Agregué una nota para aclarar las cosas – barjak

Cuestiones relacionadas