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のようなメソッドが(voidではなく)booleanを返す点です。これは、そのメソッドを呼び出した時点で要素がセットに含まれていたかどうかを示します。
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™️の楽しさに加わってほしいですよね。その一番の近道は、カードを1枚あげて、友達のコレクションのきっかけを作ることです。
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"}