集合是不可變、無序的,其中的值都獨一無二。集合中的所有元素都必須是相同的型別。
gleam/set 模組定義了 Set 型別,並提供各種處理集合的函式。
你可以用 set.to_list 和 set.from_list 把陣列和集合互相轉換。集合中元素的順序並沒有保證。
set.from_list([2, 3, 3, 3, 1, 1, 2])
// -> set.from_list([1, 2, 3])
set.to_list(set.from_list([2, 3, 3, 3, 1, 1, 2]))
// -> [1, 2, 3]
你可以用 set.new、set.insert 和 set.delete 建立集合並填入元素。
set.new()
// -> set.from_list([])
let eighty_eight = set.from_list([88])
set.insert(eighty_eight, 88)
// -> set.from_list([88])
set.insert(eighty_eight, 89)
// -> set.from_list([88, 89])
set.delete(eighty_eight, 89)
// -> set.from_list([88])
你可以用 set.contains 和 set.size 這兩個函式查詢集合的內容。
set.contains(eighty_eight, 88)
// -> True
set.size(eighty_eight)
// -> 1
集合可以用 set.union 和 set.intersection 來結合。
let a = set.from_list([1, 5, 10])
let b = set.from_list([1, 2, 3, 4, 5])
set.union(a, b)
// -> set.from_list([1, 2, 3, 4, 5, 10])
set.intersection(a, b)
// -> set.from_list([1, 5])
你也可以篩選集合。
let is_small = fn(n) { n <= 3 }
set.filter(b, is_small)
// -> set.from_list([1, 2, 3])
你對 Blorkemon™️ 卡片的懷舊之情絲毫沒有減退的跡象,甚至又開始收集起來,還拉著朋友一起加入。
在這個練習中,卡片收藏以Set(String)表示,因為當你的目標是蒐集所有現有的卡片時,重複的卡片並不重要。
你真的很希望朋友們也加入你的 Blorkemon™️ 狂熱,而最好的方式就是送他們 1 張卡片,幫他們的收藏起個頭。
實作new_collection,把一張卡片轉換成一個收藏。
new_collection("Newthree")
// -> set.from_list(["Newthree"])
有了收藏之後,它便有了自己的生命,必須持續成長。
實作add_card,它接收一張卡片和一個收藏,並回傳一個帶有 2 個值的元組:一個Bool,表示這張卡片是否已經在收藏裡,以及加入該卡片後的收藏。
add_card(set.from_list(["Newthree"]), "Scientuna")
// -> #(False, set.from_list(["Newthree", "Scientuna"]))
既然朋友們又為 Blorkemon™️ 瘋狂了,你就可以藉由交易卡片來擴充自己的收藏。
不是每筆交易都值得做,有些甚至根本做不成。 你不能交易自己沒有的卡片,也不該拿一張卡片去換自己已經有的卡片。
實作trade_card,它接收 2 張要交易的卡片(你的和對方的)以及你目前的收藏。
回傳值是一個帶有 2 個值的元組:一個Bool,說明這筆交易是否可行又值得,以及假如你真的完成交易後會得到的收藏(即使實際上根本不可能)。
trade_card("Scientuna", "Newthree", set.from_list(["Scientuna"]))
// -> #(True, set.from_list(["Newthree"]))
你和熱愛 Blorkemon™️ 的朋友們聚在一起,想著哪些卡片最常見。
實作boring_cards,它接收一個收藏的陣列,回傳一個排序過的卡片陣列,這些卡片是所有收藏都有的。
boring_cards([set.from_list(["Scientuna"]), set.from_list(["Newthree", "Scientuna"])])
// -> ["Scientuna"]
你和朋友們加起來,擁有全部的 Blorkemon™️ 卡片嗎?
實作total_cards,它接收一個收藏的陣列,回傳所有收藏中不同卡片的總數。
total_cards([set.from_list(["Scientuna"]), set.from_list(["Newthree", "Scientuna"])])
// -> 2
你的侄子快要來拜訪你了,你想讓他印象深刻。 小孩子都喜歡閃亮亮的東西,對吧? Blorkemon™️ 卡片也能有閃亮版本喔!
實作shiny_cards,它接收一個收藏,回傳一個集合,裡面包含所有以"Shiny "開頭的卡片。
shiny_cards(set.from_list(["Newthree", "Scientuna", "Shiny Scientuna"]))
// -> set.from_list(["Shiny Scientuna"])