Почему HashSet сортирует отдельные буквенные символы? - PullRequest
0 голосов
/ 11 июня 2018

Итак, я знаю, что HashSet не имеет реальных возможностей сортировки, как SortedSet, однако я наткнулся на это:

Когда я запускаю следующий код:

 public static void main(String[] args) {
    Set<String> collection = new HashSet<String>(2000);
    String[] data = {"a", "c", "g", "f", "b", "f", "b", "d","q","r","d","m"};
    for(String input: data)
    {
        collection.add(input);
    }
    System.out.println("Output: " + collection);
}

я получаюследующий вывод: Вывод: [a, b, c, d, f, g, m, q, r]

, который отсортирован по алфавиту.Это почему?Поскольку HashSet не является отсортированным набором.

Поэтому я попытался использовать строку символов вместо одного символа:

public static void main(String[] args) {
    Set<String> collection = new HashSet<String>(2000);
    String[] data = {"atjre", "crj", "gertj", "fertj", "berj"};
    for(String input: data)
    {
        collection.add(input);
    }
    System.out.println("Output: " + collection);
}

И я получаю следующий вывод: Вывод: [crj,atjre, fertj, gertj, berj]

Теперь они больше не сортируются, есть ли объяснения этому?Или это просто случайное совпадение?

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Согласно документации Java: https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html

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

Я думаю, что вы испытываете здесь аномалию распределения хэш-функции.Хеш-функция используется внутри, чтобы дать вашим строкам целочисленный индекс.Для 1-длинных строк не так много сложностей.По мере того, как вы делаете строки длиннее, с вашей хеш-функцией приходится работать больше.

Это связано с самой идеей хеш-функции: взять набор возможных значений и отобразить их как можно более равномерно внабор меньших значений.Просто так получилось, что хеш-функция отображает эти строки так, как она это делает.Вы, вероятно, увидите то же самое с последовательными номерами.И вы начинаете видеть их неупорядоченными, как только вводятся дополнительные данные.

0 голосов
/ 11 июня 2018

HashSet реализует Set интерфейс.Это означает, что нет гарантии порядка элементов.

Этот класс реализует интерфейс Set, поддерживаемый хэш-таблицей (фактически, экземпляром HashMap).Это не дает никаких гарантий относительно порядка итераций множества;в частности, это не гарантирует, что порядок останется постоянным с течением времени. Источник

Через некоторое время после добавления, несколько раз вы можете увидеть разницу.

Однако «никаких гарантий заказа» не подразумевает »гарантированный случайный порядок ".Точный ответ на ваш вопрос:

Метод hashcode класса String также используется здесь, для одиночного персонажа String s hashcode будет просто int значение одного char в String.И поскольку char int значения упорядочены в алфавитном порядке, то же самое можно сказать и о вычисленных hashes единичных char String с.

...