Ich möchte mein Hash in absteigender Reihenfolge nach den Werten sortieren. Wie mache ich das in Java?Welcher ist der einfachste Weg, Karten nach Werten in Java zu sortieren?
Antwort
Verwenden Sie Collections.reverseOrder().
Ich denke, das schwierige Bit mit der Frage ist "nach den Werten", nicht "absteigend" – Buhb
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.
}
});
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;
}
können Sie etwas konkreter über Ihr Problem? Dies kann eine Alternative zum Sortieren nach Wert sein, abhängig von Ihrem tatsächlichen Problem. – Carl