Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705

Обсуждение HashSet, в частности- хранит HashSet объекты отсортированными или нет?

31.03.2014, 23:48. Показов 2578. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что-то я не могу понять. Смотрите, мне надо запихать 10000 случайных элементов типа Integer в порядке их генерирования в HashSet, а потом их вывести. Вроде как если HachSeеt хранит их неотсортированными, то и вывести они должны абы как. Но нет. Вот их вывод:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.*;
 
public class SetOfInteger {
  public static void main(String[] args) {
    Random rand = new Random(47);
    Set<Integer> intset = new HashSet<Integer>();
    for(int i = 0; i < 10000; i++) {
      Integer x= rand.nextInt(10);
      // System.out.print(x);
      intset.add(x);
    }
    System.out.println(intset);
  }
}
Вывод:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 16, 19, 18, 21, 20, 23, 22, 25, 24, 27, 26, 29, 28]
Это что, прикол такой? Я надеялся работать с рандомной последовательностью c нормальным распределением. Мне что её, по новой перемешивать?

Так, наверное, это HashSet так реализован, что ему, чтобы удалять (или вообще не включать в себя) из себя повторяющиеся элементы, необходимо прибегать к какой-то там сортировке. Повторяю, не сортировка, чтобы элементы сортирнуть (по определению, они хранятся неотсортированными), а сортировка, чтобы не было одинаковых. Но как-то мне от этого не легче. Тем более, что вот вывод этого же примера, взятый из книги Брюса Эккеля:

[15, 8, 23, 16, 7, 22, 9, 21, 6, 1, 29, 14, 24, 4, 19, 26, 11, 18, 3, 12, 27, 17, 2, 13, 28, 20, 25, 10, 5, 0]
Вот это мешанина так мешанина, я понимаю. Почему же у Брюса Эккеля получилось, а у меня нет? Какие будут соображения на этот счёт? Спасибо, кто откликнется. verylazy не беспокоиться.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.03.2014, 23:48
Ответы с готовыми решениями:

HashSet. Удалить объект-класс из HashSet
Всем привет! Есть код: HashSet&lt;Human&gt; humanHashSet = new HashSet(); humanHashSet.add(new...

Загрузить ListView из HashSet (ну или простого List)
По итерации цикла в строковое множество закладывается по две разных строки их всегда четное количество. Как их разделить эти строки по...

Contains for HashSet
Приветствую! Не находит слово: &quot;Москв&quot; HashSet&lt;string&gt; totalCity = new HashSet&lt;string&gt;(); using (StreamReader sr =...

7
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
01.04.2014, 00:21
HashSet хранит информацию используя механизм хэширования, в котором содержание ключа используется для вычисления уникального значения - хещ код. Этот хеш код затем применается в качестве индекса которому ассоциированные данные, т.е. в вашем случае это X. Преобразование ключа в хэш код выполняется автоматически и вы не можете контролировать этот процесс.

В вашем случае получается отсортированная коллекция потому что это совпадение Просто получилось что хэш коды размещены в подобном порядке:
X1 < X2 < X3 < X4 < ... < X9
1
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
01.04.2014, 03:48
А вообще виновато "бинарное дерево", реализация HashSet целиком и полностью делегирует HashMap (тойсь не имеет своей реализации, а заставляет всю работу делать HashMap'e), а у HashMap есть изначальный массив на 16 ячеек типа Entry, а в какую ячейку попадет значение - вычисляется (hashCode % к-во_ячеек - 1), итого и имеем. Представьте себе массив на 16 элементов...

1 % 16 - 1 = 0 - значит попадает в table[0]
2 % 16 - 1 = 1 - а эта попадает в table[1]
....
17 % 16 - 1 = 0 - и по кругу, идея понятна

когда "степень загрузки" достигает oldCapacity * loadFactor ... loadFactor = 0.75 по умолчанию, то размер увеличивается массива table в два раза, и происходит пересчет позиций (теперь то у нас 32 корзины для хранения, а затем 64.....128.......), но т.к. у нас тип Integer - то как бы не старались - Insane__ правильно написал - всегда будет в порядке возрастания, но стоит нам переопределить метод hashCode и поставить свои условия - такой "шары" больше не будет

IntegerWrapper.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class IntegerWrapper {
    int i;
    Random random = new Random();
 
    IntegerWrapper (int i) {
        this.i = i;
    }
 
    @Override
    public int hashCode() {
        return i * random.nextInt(100);
    }
 
    @Override
    public String toString() {
        return Integer.toString(i);
    }
}
и для теста
Java
1
2
3
4
5
        Set<IntegerWrapper> set = new HashSet<>();
        for (int i = 0; i < 100; i++) {
            set.add(new IntegerWrapper(i));
        }
        System.out.println(set);
Добавлено через 4 минуты
кстати, вот hashCode класса Integer
Java
1
2
3
    public int hashCode() {
        return value;
    }


Добавлено через 27 секунд
что собственно и есть логично, не подумайте
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
01.04.2014, 09:03
Цитата Сообщение от tankomaz Посмотреть сообщение
А вообще виновато "бинарное дерево"
Осталось понять, причем здесь бинарное дерево?
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
01.04.2014, 13:41  [ТС]
Цитата Сообщение от Insane__ Посмотреть сообщение
HashSet хранит информацию используя механизм хэширования, в котором содержание ключа используется для вычисления уникального значения - хещ код. Этот хеш код затем применается в качестве индекса которому ассоциированные данные, т.е. в вашем случае это X. Преобразование ключа в хэш код выполняется автоматически и вы не можете контролировать этот процесс.
В вашем случае получается отсортированная коллекция потому что это совпадение Просто получилось что хэш коды размещены в подобном порядке:
X1 < X2 < X3 < X4 < ... < X9
То есть я правильно понял, что там внутри какая-то таблица хеширования типа такой, в которой ключи ОТСОРТИРОВАНЫ

ключ.....значение
ключ__00...........
ключ__11...........
ключ__22...........
ключ__33...........
ключ__44...........
ключ__55...........
........................
ключ_2928..........

И потом эта таблица выводится согласно ключам, начиная от значения, которое соответствует ключ_0 и заканчивает значением, которое соответствует ключ_29. И вдруг оказывается, что выводимые значения ПОЧТИ отсортированы?

////////////////////////////////////////////////////////////////////////////////

Если это так, тогда вывод- грош цена этим ключам. Хэш-код значения (суть ключ), он должен быть каким-то сложногенерированным. А тут почти полное соответствие между значениями и ключами. Почти линейная зависимость, типа:

ключ=k*значение+какая_то_незначительная_ лямбда
Эта какая_то_незначительная_лямбда и даёт, что в некоторых местах последовательность всё же неотсортированная. Я упрощаю, но зависимость ключа от значения- прямо скажем, корявая. Не хэш это. Это ДАЛЕКО не MD5 и не SHA-1.

Они бы уж сразу ставили в соответствие значению его порядковый номер, и пусть бы значения хранились отсортированными, чтобы людей не смущать. А для мешанины добавляли бы отдельную функцию. А то и не вашим и не нашим. И отсортированной назвать нельзя, и без дополнительного перемешивания не обойтись.

////////////////////////////////////////////////////////////////////////////////

И остался вопрос- почему у Эккеля-то мешанина всё-таки получается? У него что, ключи по-другому вычисляются?

Добавлено через 6 минут
Цитата Сообщение от tankomaz Посмотреть сообщение
кстати, вот hashCode класса Integer
Не понял, это что, в качестве хэш-кода числа возвращается его значение?
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
01.04.2014, 14:07
Цитата Сообщение от kravam Посмотреть сообщение
И остался вопрос- почему у Эккеля-то мешанина всё-таки получается?
Может он исользовал другую реализацию HashMap-а. Старой версии, например, или вообще не от Sun/Oracle.
Цитата Сообщение от kravam Посмотреть сообщение
Не понял, это что, в качестве хэш-кода числа возвращается его значение?
Да
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
01.04.2014, 14:21  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
Да
И у меня так. Но если бы он использовался, то печаталась бы полностью отсортированная последовательность! А там начиная с 16-го чётные и нечётные значения обмениваются значениями ключей.

Это у них видать, и называется, "хранить неотсортированным"...
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
02.04.2014, 03:06
Цитата Сообщение от turbanoff Посмотреть сообщение
Осталось понять, причем здесь бинарное дерево?
виноват, но остальное считаю святой правдой, хоть в этом не ошибаюсь по знаниям?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.04.2014, 03:06
Помогаю со студенческими работами здесь

HashSet
кто может дать полное описание класса HashSet&lt;T&gt;???

HashSet
HashSet позволяет внести одинаковые элементы. Я так понимаю и идентичность обосновывается на хешах, которые совпадают, но тем не менее...

Удаление из HashSet
Ребят, поясните пожалуйста или киньте ссылочку на понятную статью, которая поможет понять почему такой код не работает?почему нужно...

HashSet . TreeSet
С помощью Scanner ввести слова(слово exit останавливает ввод). Используя HashSet получить уникальные и дублированные. Введение в виде...

Задачка на HashSet
На листе в клетку закрашена часть клеток. Выделить все различные фигуры, которые образовались при этом. Фигурой считается набор закрашенных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru