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"}