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(), а якщо hashCode() збігаються, то за equals.



4. Порівняння колекцій: List vs 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
Задача перевірка наявності.