JavaRush /Курси /Java Syntax Zero /Колекція HashSet

Колекція HashSet

Java Syntax Zero
Рівень 14 , Лекція 1
Відкрита

1. Контейнери та колекції

Контейнерами або колекціями називають класи, які дають змогу зберігати й обробляти багато об'єктів одразу. Ви вже знаєте два різновиди контейнерів — масиви та списки.

У Java є кілька десятків колекцій, кожна з яких зберігає елементи у свій особливий спосіб. Ця таблиця містить скорочений перелік колекцій:

Тип колекції Клас Опис
List
ArrayList
Список
LinkedList
Зв'язаний список
Vector
Вектор
Stack
Стек (стос)
Set
HashSet
Множина
TreeSet
LinkedHashSet
Queue
PriorityQueue
Черга
ArrayDeque
Map
HashMap
Карта/Словник
TreeMap
HashTable

Тут є певна неоднозначність у назвах. Хоча в більшості мов програмування всі ці структури даних називають колекціями, у Java це не так. У мові Java деякі з цих класів реалізують інтерфейс Collection, а інші — ні.

Тому колекції розділили на колекції в широкому сенсі й колекції у вузькому сенсі (тільки ті, які реалізують інтерфейс Collection).

Отже, щоб не плутатися, колекціями називають тільки колекції у вузькому сенсі (класи мають реалізовувати інтерфейс Collection). Це всі колекції типів List, Set і Queue. А колекції в широкому сенсі називають контейнерами. Це класи типу Map і масиви.


2. Колекція HashSet

Клас HashSet є типовим представником колекцій типу «множина». Багато в чому він схожий на клас ArrayList і в певному сенсі є його спрощеною версією.

Створити об'єкт типу HashSet можна за допомогою такої команди:

HashSet<Тип> ім'я = new HashSet<Тип>();

де тип — це тип елементів, які можна зберігати в колекції HashSet.

Клас HashSet має такі методи:

Метод Опис
boolean add(Тип value)
Додає елемент value в колекцію
boolean remove(Тип value)
Видаляє елемент value з колекції.
Повертає true, якщо такий елемент там був.
boolean contains(Тип value)
Перевіряє, чи є в колекції елемент value
void clear()
Очищає колекцію: видаляє всі елементи
int size()
Повертає кількість елементів у колекції

Приклад використання множини.

Спробуймо написати програму, яка прощається з користувачем, якщо він з нею привітався, тобто сказав «Привіт». Щоб було цікавіше, слово «Привіт» можна буде сказати декількома мовами.

Код Примітка
HashSet<String> set = new HashSet<String>();

set.add("Привіт");
set.add("Hello");
set.add("Hola");
set.add("Bonjour");
set.add("Ciao");
set.add("Namaste");

Scanner console = new Scanner(System.in);
String str = console.nextLine();

if (set.contains(str))
   System.out.println("Да спаткання!");
Створюємо об'єкт типу HashSet, який зберігає елементи типу String.


Записуємо в set привітання різними мовами.




Вводимо з консолі слово;


якщо це слово є в нашій множині привітань, то прощаємося (білоруською мовою).


3. Множина

Колекція Set призначена для зберігання множини елементів. Тому її так і називають: Set (множина). Ця колекція має три особливості.

Операції з множинами

Із множинами можна виконувати тільки три операції: додавати елементи до множини, видаляти елементи з множини і перевіряти, чи є в множині певний елемент. Це все.

Невпорядкованість

Елементи цієї колекції не мають номерів. Неможливо отримати елемент за його індексом або записати значення в колекцію за певним індексом. Методів get() і set() множина також не має.

Унікальність елементів

Усі елементи множини є унікальними. На відміну від списку, у множині кожний елемент може бути тільки в одному примірнику. Об'єкт або міститься у множині, або ні: третього не дано. Неможливо тричі додати «чорний колір» у множину кольорів. Він там або є, або його немає.

Пошук елементів

Коли ви додаєте до множини новий елемент, видаляєте елемент або перевіряєте наявність елемента, всередині методу виконується пошук елемента. Елементи колекції та переданий елемент порівнюються спочатку за допомогою методу hashCode(), а якщо отримані хеш-значення збігаються, то за допомогою методу equals.



4. Порівняння колекцій: List і Set

Порівняймо колекції двох типів: List і Set. Які між ними основні відмінності, і коли вигідніше використовувати одну, а коли — другу?

Спробуймо порівняти Список і Множину на прикладі дитячих іграшок.

Колекція List (Список) схожа на набір іграшок в дитячій кімнаті, які розставлено біля стіни. Можна додати іграшку в кінець списку. Можна вставити її в середину, якщо дуже потрібно (але частину іграшок доведеться пересунути).

Кожна іграшка має порядковий номер. Можна взяти іграшку за її номером або замінити іграшку номер 7 на іграшку номер 13. Можна видалити зі списку іграшку номер 4. Ну і зрештою можна дізнатися кількість усіх іграшок у списку.

Колекція Set (множина) більше схожа на іграшки, скинуті на купу. У купу можна додати іграшку, можна видалити іграшку з купи, але фіксованого номера в таких іграшок немає.

Або, припустімо, ви вибираєте дитині іграшку на день народження. Тоді ви в першу чергу думаєте, є в дитини така іграшка чи ні. Тож усі іграшки, які в неї є, утворюють множину іграшок, які ви не купуватимете.

У такому разі порядок іграшок в наборі «Вже є» не має значення, так само як і наявність в іменинника двох однакових іграшок. Вас цікавлять не самі іграшки та їх кількість, а іграшки як набір певних унікальних об'єктів.

Саме для таких випадків вам і знадобиться множина Set та її найпопулярніший представник — клас HashSet.

Коментарі (17)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Кирило Рівень 43
16 липня 2024
Остання задача - то просто геніально
Viacheslav B. Рівень 1
6 березня 2024
будьте уважні ) Слово [передане слово] є в множині Слова [передане слово] немає в множині
froozy3 Рівень 29
7 лютого 2024
Ужас, я не пойму это троль от автора или просто ошибка???) возился с этм 30 минут!😀😀😀
Андрій Рівень 18
22 січня 2024
Що за тролінг в останній задачі😂
Богдан Кудовбенко Рівень 17 Expert
6 січня 2024
Різниця між "Java" та "Java," (з комою) настільки неочевидна, що я почав сумніватися не тільки в своїх навичках, але був близький, щоб почати скандинавським Богам молитись. Особливо, зважаючи, що у відповіді невірний код, та там просто .split(" ")));

      String message = words.contains(word) ? "є в множині" : "немає в множині";

        System.out.printf("Слово %s %s\n", word, message);
    }

Та у мене ще

split("[,.\\s]+")));

Мені не зарахували це рішення. Може справді є тест, який не проходжу.
Олександр Рівень 18
10 грудня 2023
Той момент, коли з першого разу написав правильний код, але витратив 9 спроб, щоб в решті скопіювавши код з правильної відповіді, зрозуміть, що код не повинен корректно працювати))))) автор задачі троль 1000лвл, буду приділяти бульше уваги ТЗ
ecotalisman Рівень 84 Expert
4 травня 2023
Потрібно змінити строчку умови для пошуку необхідного слова в реченні на:

public static HashSet<String> words = new HashSet<>(asList("Якби мене попросили вибрати мову взамін на Java, я б не вибирав".replaceAll("[,.]", "").split(" ")));
replaceAll та split - це два методи, які використовуються для роботи з рядками в Java. 1. replaceAll: Цей метод замінює всі входження певного шаблону в рядку на вказаний рядок. Він приймає два аргументи: - перший аргумент - регулярний вираз, який визначає шаблон, який потрібно знайти у рядку - другий аргумент - рядок, на який потрібно замінити знайдені входження шаблону У нашому випадку ми використовуємо replaceAll("[,.]", ""). Тут [,.] - регулярний вираз, який шукає коми та крапки, а другий аргумент - порожній рядок "". Це означає, що ми замінюємо всі коми та крапки на порожній рядок, тобто видаляємо їх. 2. split: Цей метод розділяє рядок на масив підрядків за вказаним розділювачем. Він приймає один аргумент - регулярний вираз, який використовується як розділювач. У нашому випадку ми використовуємо split(" "). Тут " " - регулярний вираз, який відповідає пробілу. Метод розділяє вхідний рядок на масив підрядків, розділяючи його за пробілами. Отже, в нашому прикладі, спочатку ми видаляємо коми та крапки з рядка, використовуючи replaceAll("[,.]", ""), а потім розділяємо отриманий рядок на масив слів за пробілами, використовуючи split(" "). Після внесення змін в строчку з ініціалізацією 'words' в консоль не буде виводитись кожного разу однакова відповідь, хоча слово 'Java' є в реченні: Слова JavaScript немає в множині Слова Java немає в множині
Kostiantyn Bogatyrchuk Рівень 14 Expert
26 березня 2023
Переклад Set , як "множина" не коректний і збиває з толку. Більше підходить дослівний переклад "набір" чи "комплект", адже у комплекті чи наборі в основному речі не дублюються.
les_yeux_blancs Рівень 50
26 квітня 2023
ну тут дослівний переклад, який в принципі є правильним, просто що люди не так часто використовують у мовленні слово "множина", особливо у цьому значенні) найправильніше думати про цю сутність як про, наприклад, невпорядкований список покупок у магазині: там щось або є, або нема вирішуючи, купити товар х або ні, ти дивишся, чи є він у списку створюючи список, ти додаєш в нього елементи, при цьому їх позиція неважлива, а, придбавши щось зі списку, ти це просто викреслюєш
Pavlo Kezin Рівень 23
11 вересня 2023
мені теж так було б легше зрозуміти.
Yaroslav Tkachyk Рівень 23 Expert
6 січня 2023
Коли ви додаєте до множини новий елемент, видаляєте елемент або перевіряєте наявність елемента, всередині методу виконується пошук елемента. Мається на увазі всередині множини?
les_yeux_blancs Рівень 50
26 квітня 2023
думаю мають на увазі, що метод, що викликається, сам виконує пошук у множині, але вирішили підкреслити саме факт того, що він це робить
20 серпня 2022
Задача перевірка наявності.