Коротка відповідь
Використовуйте 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 разів повільніше для кожного пошуку елементів.