Krótka odpowiedź
Użyj a TreeMap
. Właśnie po to jest.
Jeśli ta mapa została Ci przekazana i nie możesz określić typu, możesz wykonać następujące czynności:
SortedSet<String> keys = new TreeSet<>(map.keySet());
for (String key : keys) {
String value = map.get(key);
// do something
}
Spowoduje to iterację po mapie w naturalnej kolejności klawiszy.
Dłuższa odpowiedź
Technicznie rzecz biorąc, możesz użyć wszystkiego, co implementuje SortedMap
, ale z wyjątkiem rzadkich przypadków jest to równoznaczne z TreeMap
korzystaniem z Map
implementacji HashMap
.
W przypadkach, w których klucze są złożonym typem, który nie implementuje Porównywalnego lub nie chcesz wtedy używać naturalnego porządku TreeMap
i TreeSet
masz dodatkowych konstruktorów, które pozwalają przekazać Comparator
:
// placed inline for the demonstration, but doesn't have to be a lambda expression
Comparator<Foo> comparator = (Foo o1, Foo o2) -> {
...
}
SortedSet<Foo> keys = new TreeSet<>(comparator);
keys.addAll(map.keySet());
Pamiętaj, gdy używasz a TreeMap
lub TreeSet
, że będzie on miał inną charakterystykę wydajności niż HashMap
lub HashSet
. Z grubsza mówiąc operacje, które wyszukują lub wstawiają element, przechodzą z O (1) do O (Log (N)) .
W ciągu a HashMap
przejście z 1000 przedmiotów do 10 000 tak naprawdę nie wpływa na czas wyszukiwania elementu, ale dla TreeMap
czasu wyszukiwania będzie on około 3 razy wolniejszy (przy założeniu Log 2 ). Przejście z 1000 do 100 000 będzie około 6 razy wolniejsze dla każdego wyszukiwania elementu.
Zakładając, że TreeMap nie jest dla ciebie dobry (i zakładając, że nie możesz używać ogólnych):
źródło
Za pomocą
TreeMap
możesz posortować mapę.źródło
Użyj TreeMap !
źródło
Jeśli masz już mapę i chcesz ją posortować według kluczy, po prostu użyj:
Kompletny przykład działania:
źródło
Wystarczy użyć TreeMap
Pamiętaj, że TreeMap jest sortowany zgodnie z naturalną kolejnością „kluczy”
źródło
Pod warunkiem, że nie możesz używać
TreeMap
, w Javie 8 możemy skorzystać z metody toMap () ,Collectors
która przyjmuje następujące parametry:Przykład Java 8
Możemy zmodyfikować przykład, aby użyć niestandardowego komparatora i sortować na podstawie kluczy jako:
źródło
Za pomocą Java 8:
źródło
Ten kod może sortować mapę klucz-wartość w obu zamówieniach, tj. Rosnąco i malejąco.
Jako przykład:
źródło
W Javie 8
Aby posortować
Map<K, V>
według klucza, wkładając klucze doList<K>
:Aby posortować
Map<K, V>
według klucza, wstawiając wpisy doList<Map.Entry<K, V>>
:Last but not least: do sortowania ciągów w sposób uwzględniający ustawienia regionalne - użyj klasy Collator (komparator):
źródło
źródło
W Javie 8 możesz także użyć .stream (). Sorted ():
źródło
Możemy również posortować klucz za pomocą metody Arrays.sort.
źródło
Na wypadek, gdybyś nie chciał użyć
TreeMap
Ponadto, w przypadku, gdy chciał, aby uporządkować swoje mapy na podstawie
values
tylko zmianyMap.Entry::getKey
doMap.Entry::getValue
źródło