Как получить элементы в правильном порядке из итератора ()

Вот мой код для хранения данных в HashMap и отображения данных с помощью итератора

public static void main(String args[]) {
    HashMap<String, String> hm = new HashMap<String, String>();
    hm.put("aaa", "111");
    hm.put("bbb", "222");
    hm.put("ccc", "333");
    hm.put("ddd", "444");
    hm.put("eee", "555");
    hm.put("fff", "666");

    Iterator iterator = hm.keySet().iterator();

    while (iterator.hasNext()) {
        String key = (String) iterator.next();
        String val = hm.get(key);

        System.out.println(key + " " + val);
    }
}

Но это не отображается в том порядке, в котором я храню. Может кто-нибудь сказать мне, где я иду не так? Как я могу получить элементы в порядке?

4 ответа

Решение

HashMap не имеет гарантированного заказа:

Этот класс не дает никаких гарантий относительно порядка карты;

Используйте LinkedHashMap.

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

Вам нужно использовать LinkedHashMap, потому что он поддерживает порядок своих записей, в отличие от HashMap.

Из Javadocs:

... реализация интерфейса Map с предсказуемым порядком итераций. Эта реализация отличается от HashMap тем, что поддерживает двусвязный список, проходящий через все его записи. Этот связанный список определяет порядок итераций, который обычно является порядком, в котором ключи были вставлены в карту (порядок вставки).

HashMap не поддерживает порядок, в котором мы помещаем данные в него. Так что вы можете следовать LinkedHashMap вместо этого. Он сохраняет порядок, в котором мы помещаем данные.LinkedHashMap может использоваться так же, как HashMap.

Map<key,value> map=new LinkedHashMap<key,value>();
map.put("key","value");
map.put("key","value");
map.put("key","value");

// Точно так же вы можете использовать итератор для доступа к данным. Он отобразит dfata в том порядке, в котором вы добавили его.

Причина в том, что HashMap и HashSet не гарантирует порядок сохраненных значений. Положение элементов будет зависеть от размера внутренней таблицы и hashCode ключа.

Если вы хотите загрузить данные в некотором порядке, вам нужно отсортировать ключи / или значения. Например, вы можете поместить коллекции записей (Map.entrySet()) в список и отсортировать их по любым критериям. Или вы можете использовать SortedMap (например, TreeMap) для хранения ваших объектов.

Другие вопросы по тегам