位元詩人 [Nim] 語言程式教學:集合 (Set)

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

在這裡的 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])
關於作者

身為資訊領域碩士,位元詩人 (ByteBard) 認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

位元詩人喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,位元詩人將所學寫成文章,放在這個網站上和大家分享。