Реализация итератора с итерируемым в Hashmap - это возможно?

1

Как создать Iterator (путем реализации iterable) в Hashmap, если он не сохраняет порядок? мои ключи должны быть заказаны.. и я хочу итерации в порядке убывания

  • 0
    Вы можете перебирать набор записей.
  • 1
    Сам Iterator ничего не говорит о порядке, он просто перебирает элементы коллекции.
Показать ещё 4 комментария
Теги:
hashmap
iterable

3 ответа

3
Лучший ответ

Используйте TreeMap возможно:

Карта сортируется в соответствии с естественным порядком ее ключей

Кроме того, из документации TreeMap.keySet():

Возвращает заданный вид ключей, содержащихся на этой карте. Итератор set возвращает ключи в порядке возрастания


Пример итерации:

TreeMap<K,V> tree;
// ...
for (final String key : tree.keySet()) {
    final V value = tree.get(key);
}
  • 0
    как мне повторить, если у меня нет метода get (index)?
  • 0
    У вас есть get()
Показать ещё 4 комментария
1

Это правда, что HashMap не сохраняет порядок вставки. Но вы можете использовать LinkedHashMap о котором Javadoc говорит (частично)

Хэш-таблица и связанный список реализации интерфейса Map с предсказуемым порядком итерации.

  • 0
    да, но связанная карта не имеет метода get (index)
  • 0
    @Shiran Исправить (например, HashMap ), он имеет get(Object key) . На твой вопрос ответил HashMap , а не List .
Показать ещё 2 комментария
0

Вы можете скопировать записи из 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);
        }
    });

Ещё вопросы

Сообщество Overcoder
Наверх
Меню