Hashset печать значений в том же порядке каждый раз? - PullRequest
0 голосов
/ 12 мая 2018

Per HashSet java docs

Не дает никаких гарантий относительно порядка итерации набора;в частности, это не гарантирует, что порядок будет оставаться постоянным во времени

Код: -

    Set<String> set = new HashSet<String>();
    set.add("This is Tiger");
    set.add("This is Cat");
    set.add("This is Dog");
    set.add("This is Elephant");
    set.add("This is Parrot");



    for(int i=0;i<100;i++){

        for(String str:set){
            System.out.println(str);
        }

    }

Когда я выполняю вышеуказанный код любое количество раз, я вижу нижеoutput

    This is Elephant
    This is Parrot
    This is Cat
    This is Dog
    This is Tiger

Мой вопрос: когда в java docs говорится, что HashSet не гарантирует, что порядок будет оставаться постоянным в течение некоторого времени, тогда почему я вижу вышеприведенный порядок одинаковым любое количество раз, когда я выполняю программу.

Выполняет ли он внутреннее упорядочение на основе хеш-кода строки?

Обновление: - На основании ответов выглядит, как порядок будет предсказуемым, если задано статическое значение.Когда я говорю «предсказуемый», это не означает, что порядок поиска будет таким же, как порядок вставки, но независимо от того, какой порядок был возвращен в первый раз, он будет таким же со временем.добавив 5 статических записей, он поместит эти записи в корзину (ничего, кроме некоторой позиции в списке / массиве) на основе хэш-кода.Let's Elephant подходит под 3-е ведро, Попугай - 5-е ведро, Кошка - 6-е ведро, Собака - 9-е ведро, Тигр - 10-е ведро

Теперь, если я добавлю жирафа, он подойдет для 8-го ведра на основе хэш-кода> Сейчасесли я повторяю, он будет повторять записи из начального сегмента.Это будет постоянным во времени.Таким образом, если set - статический порядок, то он может быть предсказуемым.

Я не собираюсь использовать Hashset для упорядочивания, но у меня есть сторонний код, помещающий статические записи в HashSet, которые я не могу изменить.Мне нужно по какой-то причине предсказать порядок среди этих записей

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Помимо понимания гарантий, о которых говорится в комментариях и других ответах, есть встроенная функция HashMap (то есть HashSet), основанная на которой в значительной степени влияет на порядок значений:

Замечания по реализации.

Эта карта обычно действует как хэш-таблица с ячейками (с пакетами), но когда ячейки становятся слишком большими, они преобразуются в ячейки TreeNodes, каждая из которых структурирована аналогичнов java.util.TreeMap.Большинство методов пытаются использовать обычные ячейки, но при необходимости переходят на методы TreeNode (просто проверяя экземпляр узла).Бункеры TreeNodes могут быть просмотрены и использованы как любые другие, но дополнительно поддерживают более быстрый поиск при перенаселении.Однако, поскольку подавляющее большинство бинов при обычном использовании не переполнено, проверка существования бинов дерева может быть отложена в ходе табличных методов.

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

0 голосов
/ 12 мая 2018

Не дает никаких гарантий относительно порядка итераций множества; в частности, это не гарантирует, что заказ останется постоянным во времени

Бывает, что у вас статический Set. Гарантия вступает в силу при изменении существующего Set с новыми дополнениями:

И ты прав. Ваша программа вернется, как и ожидалось.

    Set<String> set = new HashSet<String>();
    set.add("This is Tiger");
    set.add("This is Cat");
    set.add("This is Dog");
    set.add("This is Elephant");
    set.add("This is Parrot");

    /*
      This is Elephant
      This is Parrot
      This is Cat
      This is Dog
      This is Tiger
     */
    for (String str : set) {
        System.out.println(str);

    }

Теперь давайте добавим новую запись, например, жирафа в Set.

    Set<String> set2 = new HashSet<String>();
    set.add("This is Tiger");
    set.add("This is Cat");
    set.add("This is Dog");
    set.add("This is Elephant");
    set.add("This is Parrot");
    set.add("This is Giraffe");

    /*
      This is Elephant
      This is Parrot
      This is Cat
      This is Giraffe
      This is Dog
      This is Tiger
     */
    for (String str : set) {
        System.out.println(str);

    }

Порядок изменения элементов.

Следует иметь в виду, что вы не должны полагаться на порядок итераций набора, поскольку порядок вставки 1019 * не предсказуем, в отличие от предсказуемого порядка вставки, такого как LinkedHashSet* 1021. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...