Set - це невпорядкована колекція, яка (на відміну від List) гарантовано не містить дублікатів значень.
Параметр узагальненого типу інтерфейсу Set позначає тип елементів, що містяться в Set:
Set<Integer> ints = Set.of(1, 2, 3);
Set<String> strings = Set.of("alpha", "beta", "gamma");
Set<Object> mixed = Set.of(1, false, "foo");
Зауважмо, що метод Set.of() створює незмінний екземпляр Set.
Спроба викликати методи add і remove у цього екземпляра призведе до винятку під час виконання.
Щоб створити змінюваний Set, потрібно створити екземпляр класу, який реалізує інтерфейс Set.
Найчастіше для цього використовують вбудований клас HashSet, який реалізує цей інтерфейс.
Set<Integer> ints = new HashSet<>();
Інтерфейс Set розширює інтерфейси Collection і Iterable, а тому має багато спільних методів з іншими типами колекцій.
Однак помітна відмінність від інтерфейсу Collection полягає в тому, що методи add і remove повертають boolean (а не void), який указує, чи містився елемент у множині на момент виклику методу:
Set<Integer> set = new HashSet<>();
set.add(1);
// => true
set.add(2);
// => true
set.add(1);
// => false
set.size();
// => 2
set.contains(1);
// => true
set.contains(3);
// => false
set.remove(3);
// => false
set.remove(2);
// => true
set.size();
// => 1
Наша ностальгія за картками Blorkemon™️ і не думає вщухати: ми навіть знову почали їх колекціонувати і залучаємо до цього своїх друзів.
У цій вправі ми скористаємося інтерфейсом Set, щоб упорядкувати свою колекцію, адже коли наша мета - зібрати всі наявні картки, дублікати не мають значення.
Ми щойно знайшли свої старі запаси карток Blorkemon™️! У цих запасах повно дублікатів, тож час створити нову колекцію, прибравши дублікати.
Ми дуже хочемо, щоб друзі долучилися до нашого божевілля Blorkemon™️, і найкращий спосіб - започаткувати їхню колекцію, подарувавши їм одну картку.
Реалізуйте метод newCollection, який перетворює список карток на Set, що представляє нашу нову колекцію.
GottaSnatchEmAll.newCollection(List.of("Newthree", "Newthree", "Newthree"));
// => {"Newthree"}
Коли колекція вже є, вона починає жити власним життям і мусить рости.
Реалізуйте метод addCard, який приймає нову картку та наш поточний набір зібраних карток.
Метод має додати нову картку до колекції, якщо її там ще немає, і повернути boolean, що вказує, чи було оновлено колекцію.
Set<String> collection = GottaSnatchEmAll.newCollection("Newthree");
GottaSnatchEmAll.addCard("Scientuna",collection);
// => true
collection.contains("Scientuna");
// => true
Ми дуже хочемо, щоб друзі долучилися до нашого божевілля Blorkemon™️, тож час починати обмін!
Коли ми обмінюємося з друзями, не кожен обмін вартий того, та й не кожен можна здійснити взагалі. Обмінюватися варто лише тоді, коли і в нас, і в друга є картка, якої немає в іншого.
Реалізуйте метод canTrade, який приймає нашу поточну колекцію та колекцію одного з наших друзів.
Він має повернути boolean, що вказує, чи можливий обмін, за наведеними вище правилами.
Set<String> myCollection = Set.of("Newthree");
Set<String> theirCollection = Set.of("Scientuna");
GottaSnatchEmAll.canTrade(myCollection, theirCollection);
// => true
Ми збираємося з друзями-ентузіастами Blorkemon™️ і міркуємо, які картки найпоширеніші.
Реалізуйте метод commonCards, який приймає список колекцій і повертає колекцію карток, які є в усіх колекціях.
GottaSnatchEmAll.commonCards(List.of(Set.of("Scientuna"), Set.of("Newthree","Scientuna")));
// => {"Scientuna"}
Чи маємо ми з друзями разом усі картки Blorkemon™️?
Реалізуйте метод allCards, який приймає список колекцій і повертає колекцію всіх різних карток з усіх колекцій разом.
GottaSnatchEmAll.allCards(List.of(Set.of("Scientuna"), Set.of("Newthree","Scientuna")));
// => {"Newthree", "Scientuna"}
Зареєструйтеся на Exercism, щоб вивчати й опановувати Java, а також 26 концепцій158 вправ та справжнє наставництво від людей, і все це безкоштовно.