在這裡的 set 有兩個意思,一個是數學的集合論 (set theory),一個是在 Nim 程式所實做的集合資料結構;本文不特別介紹數學理論,而會介紹如何以 Nim 進行一些集合運算。在 Nim 語言中,集合有兩種實作,一種是內建的結構,一種是透過 引入 sets 模組使用 HashSet 結構;前者僅能用於少數內建的資料型態,後者的泛用性較高;筆者覺得這樣的設計有點多餘,不過就當成 Nim 的語法特性即可。兩者使用方式大抵雷同,本文介紹 sets 套件。
建立集合
使用 initSet
方法可建立集合,見下例:
import sets
# Init a new integer set.
var s = initSet[int]()
# Include some elements.
s.incl 2
s.incl 3
s.incl 5
# Check the length of s
assert s.len == 3
# Check whether some element exists
assert s.contains(5) == true
assert s.contains(9) == false
也可以使用 toSet
方法直接將陣列轉為集合:
import sets
# Init a new integer set from an array.
var s = toSet([2, 2, 3, 5, 3])
# Check the length of s
assert s.len == 3
# Check whether some element exists
assert s.contains(5) == true
assert s.contains(9) == false
操作集合中的元素
使用 incl
可新增元素,excl
可移除元素,contains
可檢查某元素是否存在於集合中。見下例:
import sets
# Init a new integer set from an array.
var s = toSet([2, 2, 3, 5, 3])
# Check the length of s.
assert s.len == 3
# Include and exclude some elements.
s.incl(7)
s.incl(9)
s.excl(3)
# Re-check the length of s.
assert s.len == 4
# Check whether some element exists.
assert s.contains(7) == true
assert s.contains(3) == false
集合運算
透過上述方法,我們可行自行進行集合運算,但集合運算相當常見,故 sets 預先實做一些常見的集合運算,節省程式設計者的時間。見下例:
import sets
# Init two sets.
let a = toSet([1, 2, 3])
let b = toSet([3, 5])
# Union.
let u = union(a, b)
assert u == toSet([1, 2, 3, 5])
# Intersetion.
let i = intersection(a, b)
assert i == toSet([3])
# Difference.
let d = difference(a, b)
assert d == toSet([1, 2])