Коротка відповідь
Використовуйте a TreeMap. Саме для цього і потрібно.
Якщо ця карта передана вам і ви не можете визначити тип, ви можете зробити наступне:
SortedSet<String> keys = new TreeSet<>(map.keySet());
for (String key : keys) {
String value = map.get(key);
// do something
}
Це повторить всю карту в природному порядку клавіш.
Більш довга відповідь
Технічно ви можете використовувати все, що реалізує SortedMap, але за винятком рідкісних випадків, це дорівнює тому TreeMap, як Mapзазвичай використовується реалізація HashMap.
У випадках, коли ваші ключі є складним типом, який не реалізує Порівняльний, або ви не хочете потім використовувати природний порядок TreeMapі TreeSetмаєте додаткові конструктори, які дозволяють вам передати 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());
Пам’ятайте, що при використанні того TreeMapчи TreeSetіншого він буде мати інші характеристики продуктивності, ніж HashMapабо HashSet. Грубо кажучи, операції, які знаходять або вставляють елемент, перейдуть від O (1) до O (Log (N)) .
У випадку HashMapпереміщення від 1000 елементів до 10 000 насправді не впливає на ваш час на пошук елемента, але TreeMapчас пошуку буде приблизно в 3 рази повільнішим (якщо припустити журнал 2 ). Переміщення від 1000 до 100000 буде приблизно в 6 разів повільніше для кожного пошуку елементів.