學習軌道
/
Java
Java
/
練習
/
全部抓起來
全部抓起來

全部抓起來

學習練習

簡介

集合

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介面來幫助管理你的收藏,因為當你的目標是收集所有現有的卡片時,重複的卡片並不重要。

1. 開始收藏

你剛找到了你舊的那批 Blorkemon™️ 卡片! 這批收藏裡有一堆重複的卡片,所以是時候透過移除重複的卡片來開始新的收藏了。

你真的很希望朋友們加入你的 Blorkemon™️ 熱潮,最好的方式就是送他們一張卡片,幫他們的收藏起步。

實作newCollection方法,它會把卡片陣列轉換成代表你新收藏的Set。

GottaSnatchEmAll.newCollection(List.of("Newthree", "Newthree", "Newthree"));
// => {"Newthree"}

2. 擴充收藏

一旦有了收藏,它就會有自己的生命,必須持續成長。

實作addCard方法,它會接收一張新卡片和你目前收集到的卡片集合。 如果這張新卡片還不存在,方法應該把它加入收藏,並回傳一個boolean,表示收藏是否被更新。

Set<String> collection = GottaSnatchEmAll.newCollection("Newthree");
GottaSnatchEmAll.addCard("Scientuna",collection);
// => true

collection.contains("Scientuna");
// => true

3. 開始交換

你真的很希望朋友們加入你的 Blorkemon™️ 熱潮,所以是時候開始交換了!

和朋友交換時,並不是每筆交易都值得進行,甚至有些根本無法進行。 只有當你和朋友各自都有一張對方沒有的卡片時,才應該交換。

實作canTrade方法,它會接收你目前的收藏和你某位朋友的收藏。 依照上面的規則,它應該回傳一個boolean,表示是否可以交換。

Set<String> myCollection = Set.of("Newthree");
Set<String> theirCollection = Set.of("Scientuna");
GottaSnatchEmAll.canTrade(myCollection, theirCollection);
// => true

4. 找出共同卡片

你和熱愛 Blorkemon™️ 的朋友們聚在一起,想知道哪些卡片最常見。

實作commonCards方法,它會接收收藏的陣列,並回傳一個收藏,其中包含所有收藏都有的卡片。

GottaSnatchEmAll.commonCards(List.of(Set.of("Scientuna"), Set.of("Newthree","Scientuna")));
// => {"Scientuna"}

5. 所有卡片

你和朋友們加起來,擁有全部的 Blorkemon™️ 卡片嗎?

實作allCards方法,它會接收收藏的陣列,並回傳一個收藏,包含所有收藏合併後的全部不同卡片。

GottaSnatchEmAll.allCards(List.of(Set.of("Scientuna"), Set.of("Newthree","Scientuna")));
// => {"Newthree", "Scientuna"}
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Java Exercism

準備好開始 全部抓起來 了嗎?

註冊 Exercism,透過 26 個概念158 個練習 和真人引導來學習並精通 Java,全部免費。