Почему LinkedHashMap не может сортировать HashMap, а TreeMap -? - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь отсортировать вывод HashMap, используя LinkedHashMap и TreeMap.

Когда я использую TreeMap для сортировки HashMap, это работает как шарм.

        Map<Integer, String> hMap = new HashMap<Integer, String>();

        hMap.put(40, "d");
        hMap.put(10, "a");
        hMap.put(30, "c");
        hMap.put(20, "b");

        System.out.println(" ");
        System.out.println("before");

        for (Map.Entry m1 : hMap.entrySet()) {
            System.out.print(m1.getKey() + " " + m1.getValue() + "    ");
        }

        System.out.println("after");

        Map<Integer, String> hTree = new TreeMap<Integer, String>(hMap);
        for (Map.Entry m2 : hTree.entrySet()) {
            System.out.print(m2.getKey() + " " + m2.getValue() + "    ");
        }

Выход:
before 20 b 40 d 10 a 30 c<br> after 10 a 20 b 30 c 40 d

Но когда я пытаюсь с помощью LinkedHashMap отсортировать HashMap, это, похоже, не работает.

        Map<Integer, String> hMap = new HashMap<Integer, String>();

        hMap.put(10, "a");
        hMap.put(20, "b");
        hMap.put(30, "c");
        hMap.put(40, "d");

        System.out.println("before");

        for (Map.Entry m1 : hMap.entrySet()) {
            System.out.print(m1.getKey() + " " + m1.getValue() + "    ");
        }
        System.out.println(" ");
        System.out.println("after");

        LinkedHashMap<Integer, String> lhMap = new LinkedHashMap<Integer, String>(hMap);

        Iterator it = lhMap.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry me = (Map.Entry) it.next();
            System.out.print(me.getKey() + " " + me.getValue()+"   ");
        }

Выход:

before
20 b    40 d    10 a    30 c     
after
20 b   40 d   10 a   30 c  

Может кто-нибудь сказать мне, почему эта сортировка не работает? Это потому что LinkedHashMap фильтрует HashMap?
Если это так, почему TreeMap невосприимчив к этой проблеме?
Спасибо

Ответы [ 5 ]

0 голосов
/ 20 сентября 2018

HashMap не сохраняет сортировку для ключей. Более того, обратите внимание, что не защищено, что экземпляр HashMap показывает последовательности (k-v) одинаково, когда его размер изменяется из-за коэффициента загрузки.

«Link» означает, что для LinkedHashMap речь идет не о сравнении по значению ключа. Вместо этого это означает порядок вставки или порядок доступа.

порядок вставки <2, "A">, <1, "B">, <3, "C">

Порядок итерации как порядок вставки: <2, "A">, <1, "B">, <3, "C">

Тогда предположим, что реализуем операцию доступа (get / put) <1, "B"> порядок итерации как порядок доступа: <2, "A">, <3, "C">, <1, "B">

0 голосов
/ 12 сентября 2018

1) Древовидная карта будет сортировать элемент по умолчанию в естественном порядке.

2) Linkedhasmap будет поддерживать порядок вставки в виде списка.

0 голосов
/ 12 сентября 2018

TreeMap сортирует по сравнению, реализованному ключами (или переданная в конструкцию функция сравнения, сравнивающая ключи).LinkedHashMap сохраняет только порядок вставки, поэтому я предполагаю, что при его создании с использованием хэш-карты порядок вставки такой же, как и при итерации по HashMap.

0 голосов
/ 12 сентября 2018

JavaDoc из LinkedHashMap говорит:

Этот связанный список определяет порядок итераций, который обычно является порядком, в котором ключи были вставлены в карту (insert-order).

Создав LinkedHashMap, вставив HashMap, LinkedHashMap сохраняет порядок HashMap hMap.

JavaDoc для HashMap говорит:

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

Таким образом, не гарантированный порядок HashMap hMap сохраняется LinkedHashMap lhMap.

С другой стороны, вы создали TreeMap hTree, используя конструктор по умолчанию .Это означает, что вы создали « новую пустую древовидную карту, используя естественный порядок ее ключей. ».Поэтому hTree сортируется при каждой вставке.Вставка подразумевает упорядочение.

Относительно LinkedHashMap она не упорядочивает сама по себе.


Дополнительная информация: Сортировка LinkedHashMap

0 голосов
/ 12 сентября 2018

LinkedHashMap поддерживает порядок вставки. Это означает, что если вы передадите конструктору отсортированный Map или поместите ключи в LinkedHashMap в отсортированном порядке, он останется отсортированным.

Однако вы передаете HashMap в конструктор LinkedHashMap, и он не сортируется (так как HashMap не имеет порядка). Поэтому полученный LinkedHashMap также не упорядочен.

С другой стороны, TreeMap сохраняет ключи отсортированными, поэтому порядок, в котором вы помещаете ключи в TreeMap (который в вашем примере определяется порядком, с которым ключи встречаются при итерации по источнику *) 1014 *) не имеет значения - результирующий Map всегда будет отсортирован.

...