2009-12-12 5 views

Antwort

13

Ein HashMap (und sein Legacy-Vorgänger Hashtable) ist von Natur aus ungeordnet. Selbst wenn Sie es sortieren, bleibt es ungeordnet. Wenn Sie den Anzeigenauftrag beibehalten möchten, verwenden Sie stattdessen LinkedHashMap. Wenn Sie eine automatische Sortierung unter Tasten wünschen, verwenden Sie unabhängig vom Anzeigenauftrag stattdessen SortedMap.

Wenn Sie eine Map auf Werte sortieren möchten, müssen Sie die Schlüssel/Wert-Paare im Grunde in eine andere Art einer sortierbaren Datenstruktur, z. List<Entry<K, V>>, dann sortieren Sie es mit Collections#sort() mit Hilfe eines Compatator<Entry<K, V>> und schließlich ein.mit ihm wieder aufzufüllen (nicht ein HashMap oder Sie werden die Bestellung wieder verlieren).

Hier ist ein einfaches Beispiel (offensichtliche Laufzeitausnahme verlassen Umgang beiseite):

// Prepare. 
Map<String, String> map = new HashMap<String, String>(); 
map.put("foo", "bar"); 
map.put("bar", "waa"); 
map.put("waa", "foo"); 
System.out.println(map); // My JVM shows {waa=foo, foo=bar, bar=waa} 

// Get entries and sort them. 
List<Entry<String, String>> entries = new ArrayList<Entry<String, String>>(map.entrySet()); 
Collections.sort(entries, new Comparator<Entry<String, String>>() { 
    public int compare(Entry<String, String> e1, Entry<String, String> e2) { 
     return e1.getValue().compareTo(e2.getValue()); 
    } 
}); 

// Put entries back in an ordered map. 
Map<String, String> orderedMap = new LinkedHashMap<String, String>(); 
for (Entry<String, String> entry : entries) { 
    orderedMap.put(entry.getKey(), entry.getValue()); 
} 

System.out.println(orderedMap); // {foo=bar, waa=foo, bar=waa} 

es zu sortieren descencing, verwenden Sie die folgende Comparator. Grundsätzlich tauschen nur die Einträge vergleichen:

Collections.sort(entries, new Comparator<Entry<String, String>>() { 
    public int compare(Entry<String, String> e1, Entry<String, String> e2) { 
     return e2.getValue().compareTo(e1.getValue()); // Sorts descending. 
    } 
}); 
0

Hier ist, wie ich es tun:

public static <K, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) { 
Comparator<K> valueComparator = new Comparator<K>() { 
    public int compare(K k1, K k2) { 
     int compare = map.get(k2).compareTo(map.get(k1)); 
     if (compare == 0) return 1; 
     else return compare; 
    } 
}; 
Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator); 
sortedByValues.putAll(map); 
return sortedByValues; 

}