2009-02-20 22 views

risposta

68

Utilizzare un TreeMap, che è un'implementazione dell'interfaccia SortedMap. Presenta le sue chiavi in ​​ordine ordinato.

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()); 
} 

Se si sta lavorando con un'altra implementazione Mappa che non è ordinato come ti piace, si può passare al constructor di TreeMap per creare una nuova mappa con le chiavi ordinate.

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 funziona con qualsiasi tipo di chiave che implementa l'interfaccia Comparable, mettendoli nel loro ordine "naturale". Per le chiavi che non sono Comparable o il cui ordinamento naturale non è quello che ti serve, puoi implementare il tuo Comparator e specificarlo nello constructor.

+0

Il codice che sto consumando mi fornisce un oggetto Mappa, quindi come posso convertirlo in una TreeMap o utilizzare una TreeMap per eseguire l'ordinamento? – Bialecki

+0

È possibile creare la TreeMap utilizzando un costruttore il cui parametro è qualsiasi Mappa. Inoltre, congratulazioni erickson (presumo, dal momento che hai solo 5 ripetizioni da 10k). –

+0

Ding! erickson sale di livello. –

28

Hai diverse opzioni. Elencati in ordine di preferenza:

  1. Utilizzare un SortedMap:
    SortedMap<whatever> myNewMap = new TreeMap<whatever>(myOldMap);
    Questo è di gran lunga preferibile se si vuole scorrere più di una volta. Mantiene le chiavi ordinate in modo da non doverle ordinare prima di iterare.
  2. Non c'è nessun # 2.
  3. Non c'è nessun # 3.
  4. SortedSet<whatever> keys = new TreeSet<whatever>(myMap.keySet());
  5. List<whatever> keys = new ArrayList<whatever>(myMap.keySet()); Collections.sort(keys);

Gli ultimi due si ottiene ciò che si vuole, ma deve essere utilizzato solo se desideri solo per scorrere una volta e poi dimenticare tutto.

+0

Nel passaggio 4, è anche possibile creare un set di alberi (un set ordinato) anziché un elenco, che consente di evitare di effettuare una chiamata esplicita a sort(). –

+0

@David: Ci ho pensato, ma per qualche ragione ho dimenticato che era possibile iterare su un Set. Tuttavia, richiede sempre lo smistamento. –

+0

hmm mi piace il # 4. perché richiede più ordinamento rispetto al # 1?avrei pensato che fosse altrettanto buono –

8

È possibile creare una raccolta ordinata durante l'iterazione, ma è più sensato avere una mappa ordinata in primo luogo. (Come è già stato suggerito)

Tutti uguali, ecco come lo si fa.

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