2009-02-20 14 views

Respuesta

68

Utilice TreeMap, que es una implementación de la interfaz SortedMap. Presenta sus claves en orden ordenado.

Map<String, Object> map = new TreeMap<String, Object>(); 
/* Add entries to the map in any order. */ 
... 
/* Now, iterate over the map's contents, sorted by key. */ 
for (Map.Entry<String, ?> entry : map.entrySet()) { 
    System.out.println(entry.getKey() + ": " + entry.getValue()); 
} 

Si está trabajando con otra aplicación de mapas que no se clasifica como desee, puede pasar a la constructor de TreeMap para crear un nuevo mapa con llaves ordenadas.

void process(Map<String, Object> original) { 
    Map<String, Object> copy = new TreeMap<String, Object>(original); 
    /* Now use "copy", which will have keys in sorted order. */ 
    ... 
} 

A TreeMap funciona con cualquier tipo de clave que implementa la interfaz Comparable, poniéndolos en su orden "natural". Para las claves que no son Comparable, o cuyo orden natural no es lo que necesita, puede implementar su propio Comparator y especificarlo en el constructor.

+0

El código que estoy consumiendo me da un objeto Map, así que ¿cómo lo convierto en un TreeMap o uso un TreeMap para hacer la clasificación? – Bialecki

+0

Puede crear TreeMap utilizando un constructor cuyo parámetro sea cualquier mapa. Además, felicidades Erickson (supongo, ya que estás a solo 5 repeticiones de 10k). –

+0

Ding! Erickson sube de nivel. –

28

Tiene varias opciones. Clasificado por orden de preferencia:

  1. Utilice un SortedMap:
    SortedMap<whatever> myNewMap = new TreeMap<whatever>(myOldMap);
    Esto es mucho más preferible si desea repetir más de una vez. Mantiene las claves ordenadas para que no tenga que ordenarlas antes de iterar.
  2. No hay número 2.
  3. No hay n. ° 3, tampoco.
  4. SortedSet<whatever> keys = new TreeSet<whatever>(myMap.keySet());
  5. List<whatever> keys = new ArrayList<whatever>(myMap.keySet()); Collections.sort(keys);

Los dos últimos le conseguirá lo que quiere, pero sólo debe usarse si sólo desea repetir una vez y luego olvidarse de todo.

+0

En el paso # 4, también puede crear un TreeSet (un conjunto ordenado) en lugar de una lista, lo que le evita hacer una llamada explícita a sort(). –

+0

@David: Pensé en eso, pero por alguna razón olvidé que era posible iterar sobre un Set. Sin embargo, requiere clasificación cada vez. –

+0

hmm me gusta el # 4. ¿Por qué requiere más clasificación que el # 1?Hubiera pensado que era igual de bueno –

8

Puede crear una colección ordenada al iterar, pero tiene más sentido tener un mapa ordenado en primer lugar. (Como ya se ha sugerido)

De todos modos, así es como lo hace.

Map<String, Object> map; 
for(String key: new TreeSet<String>(map.keySet()) { 
    // accessed in sorted order. 
} 
Cuestiones relacionadas