2009-02-20 17 views

Odpowiedz

68

Użyj TreeMap, która jest implementacją interfejsu SortedMap. Przedstawia klucze w posortowanej kolejności.

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

Jeśli pracujesz z inną realizacją mapy, które nie są sortowane, jak chcesz, możesz przekazać je do constructor z TreeMap stworzyć nową mapę z kluczami segregowanych.

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 współpracuje z dowolnym typem klucza, który implementuje interfejs Comparable, umieszczając je w ich „naturalnym” kolejności. W przypadku kluczy, które nie są Comparable lub których naturalna kolejność nie jest tym, czego potrzebujesz, możesz zaimplementować swój własny Comparator i określić go w constructor.

+0

Kod, który spożywa, daje mi obiekt Map, więc w jaki sposób mogę go następnie przekształcić w TreeMap lub użyć TreeMap do sortowania? – Bialecki

+0

Możesz utworzyć TreeMap za pomocą konstruktora, którego parametrem jest dowolna mapa. Gratuluję też erickson (zakładam, skoro jesteś tylko 5 reprezentantem od 10k). –

+0

Ding! poziom erickson w górę. –

28

Masz kilka opcji. Wymienione w kolejności preferencji:

  1. użyć SortedMap:
    SortedMap<whatever> myNewMap = new TreeMap<whatever>(myOldMap);
    Jest to znacznie lepsze, jeśli chcesz iteracyjne więcej niż jeden raz. Utrzymuje klucze posortowane, więc nie musisz ich sortować przed iteracją.
  2. Nie ma nr 2.
  3. Nie ma również nr 3.
  4. SortedSet<whatever> keys = new TreeSet<whatever>(myMap.keySet());
  5. List<whatever> keys = new ArrayList<whatever>(myMap.keySet()); Collections.sort(keys);

Dwa ostatnie będzie Ci to, co chcesz, ale powinien być stosowany tylko wtedy, gdy chcesz tylko iteracyjne raz, a potem zapomnieć całość.

+0

W kroku 4 można również utworzyć zestaw drzewa (zbiór posortowany) zamiast listy, co pozwoli uniknąć wyraźnego wywołania funkcji sort(). –

+0

@ David: Myślałem o tym, ale z jakiegoś powodu zapomniałem, że możliwe było powtórzenie Setu. Jednak za każdym razem wymaga sortowania. –

+0

hmm podoba mi się # 4. dlaczego wymaga większego sortowania niż nr 1?myślałbym, że to było równie dobre –

8

Możesz utworzyć posortowaną kolekcję podczas iteracji, ale lepiej mieć najpierw uporządkowaną mapę. (Jak już zasugerowano)

Tak samo jak to zrobić.

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