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 TreeMapkorzystaniem z Mapimplementacji 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 TreeMapi TreeSetmasz 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 TreeMaplub TreeSet, że będzie on miał inną charakterystykę wydajności niż HashMaplub 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 HashMapprzejście z 1000 przedmiotów do 10 000 tak naprawdę nie wpływa na czas wyszukiwania elementu, ale dla TreeMapczasu 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.