Как создать Iterator (путем реализации iterable) в Hashmap, если он не сохраняет порядок? мои ключи должны быть заказаны.. и я хочу итерации в порядке убывания
Используйте TreeMap
возможно:
Карта сортируется в соответствии с естественным порядком ее ключей
Кроме того, из документации TreeMap.keySet()
:
Возвращает заданный вид ключей, содержащихся на этой карте. Итератор set возвращает ключи в порядке возрастания
Пример итерации:
TreeMap<K,V> tree;
// ...
for (final String key : tree.keySet()) {
final V value = tree.get(key);
}
get()
Это правда, что HashMap
не сохраняет порядок вставки. Но вы можете использовать LinkedHashMap
о котором Javadoc говорит (частично)
Хэш-таблица и связанный список реализации интерфейса
Map
с предсказуемым порядком итерации.
HashMap
), он имеет get(Object key)
. На твой вопрос ответил HashMap
, а не List
.
Вы можете скопировать записи из HashMap
в коллекцию, которая сохраняет заказ (например, List
), а затем сортирует их на основе ключей (в обратном порядке). Вы говорите, что хотите сортировать ключи в порядке убывания, поэтому я предполагаю, что ключ реализует Comparable
но поскольку я не знаю, какой тип вашего ключа, я использовал параметры типа K
и V
качестве заполнителей.
Map<K, V> map = new HashMap<>();
List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
@Override
public int compare(Entry<K, V> o1, Entry<K, V> o2) {
Comparable k1 = (Comparable) o1.getKey();
Comparable k2 = (Comparable) o2.getKey();
return -k1.compareTo(k2);
}
});
Iterator
ничего не говорит о порядке, он просто перебирает элементы коллекции.