2009-02-20 6 views

Antwort

68

Verwenden Sie eine TreeMap, die eine Implementierung der SortedMap Schnittstelle ist. Es präsentiert seine Schlüssel in sortierter Reihenfolge.

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

Wenn Sie mit einer anderen Karte Implementierung arbeiten, die nicht, wie Sie sortiert möchten, können Sie es an die constructor von TreeMap passieren eine neue Karte mit sortierten Schlüssel zu erstellen.

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 Arbeiten mit jeder Art von Schlüssel, der den Comparable-Schnittstelle implementiert, so dass sie in ihrer „natürlichen“ Ordnung zu bringen. Für Schlüssel, die nicht Comparable sind, oder deren natürliche Reihenfolge nicht das ist, was Sie brauchen, können Sie Ihre eigene Comparator implementieren und diese in der constructor angeben.

+0

Der Code, den ich konsumiere, gibt mir ein Map-Objekt, also wie kann ich es dann in eine TreeMap konvertieren oder eine TreeMap verwenden, um die Sortierung durchzuführen? – Bialecki

+0

Sie können die TreeMap mit einem Konstruktor erstellen, dessen Parameter eine beliebige Map ist. Außerdem, Glückwunsch Erickson (ich nehme an, da Sie nur 5 rep von 10k entfernt sind). –

+0

Ding! Erickson steigt auf. –

28

Sie haben mehrere Möglichkeiten. In der Reihenfolge der Präferenz:

  1. Verwenden Sie ein SortedMap:
    SortedMap<whatever> myNewMap = new TreeMap<whatever>(myOldMap);
    Dies ist erheblich vorzuziehen, wenn Sie mehr iterieren wollen als einmal. Es hält die Schlüssel sortiert, so dass Sie sie vor dem Iterieren nicht sortieren müssen.
  2. Es gibt keine # 2.
  3. Es gibt auch keine # 3.
  4. SortedSet<whatever> keys = new TreeSet<whatever>(myMap.keySet());
  5. List<whatever> keys = new ArrayList<whatever>(myMap.keySet()); Collections.sort(keys);

Die letzten beiden werden Sie bekommen, was Sie wollen, aber nur verwendet werden, wenn man nur einmal zu durchlaufen wollen, und dann die ganze Sache vergessen.

+0

In Schritt # 4 konnten Sie auch ein TreeSet (eine sortierte Menge) anstelle einer Liste erstellen, wodurch Sie keinen expliziten Aufruf von sort() durchführen müssen. –

+0

@David: Ich habe daran gedacht, aber aus irgendeinem Grund habe ich vergessen, dass es möglich war, über ein Set zu iterieren. Es muss jedoch jedes Mal sortiert werden. –

+0

hmm ich mag die # 4. Warum benötigt es mehr Sortierung als # 1?Ich hätte gedacht, es war genauso gut –

8

Sie können beim Iterieren eine sortierte Sammlung erstellen, aber es macht mehr Sinn, eine sortierte Karte an erster Stelle zu haben. (Wie bereits vorgeschlagen wurde)

Trotzdem, hier ist, wie Sie es tun.

Verwandte Themen