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.