位元詩人 [Nim] 語言程式教學:表 (Table)

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

表 (table) 是一種非線性的容器,儲存 (鍵, 值) 對 (key-value pair);Table 透過雜湊函式做為索引,可雜湊化的 (hashable) 型別即可做為鍵,而值沒有特別限定型別。大部分內建型別都實作好相關的雜湊函式,程式設計者不需重新實作;對於自行建立的類別,則需自行實作雜湊函式。

註:Table 有些書籍翻成表,本文從善如流;表相當於雜湊 (hash)、字典 (dictionary)、關連式陣列 (associative array) 等。

建立表

在 Nim 中,透過呼叫 tables 模組使用表。我們可以直接使用實字建立表:

import tables

var hash = {"one": "eins", "two": "zwei", "three": "drei"}.toTable
assert(hash["one"] == "eins")

或是用 initTable 建立空表:

import tables

var hash = initTable[string, string]()

hash["one"] = "eins"
hash["two"] = "zwei"
hash["three"] = "drei"

assert(hash["one"] == "eins")

除了用字串外,其他的型別也可以當成表的鍵,只要該類型符合 hashable 即可。

檢索表

使用鍵做為索引來得到值:

import tables

var hash = initTable[string, string]()

hash["one"] = "eins"
hash["two"] = "zwei"
hash["three"] = "drei"

assert(hash.hasKey("two"))
assert(hash.hasKey("four") == false)

由於雜湊函式是單向的,無法由值回推鍵,需注意。

走訪表

可藉由表的鍵來走訪表:

import tables

var hash = initTable[string, string]()

hash["one"] = "eins"
hash["two"] = "zwei"
hash["three"] = "drei"

for k in hash.keys:
  echo k

也可藉由表的值來走訪表:

import tables

var hash = initTable[string, string]()

hash["one"] = "eins"
hash["two"] = "zwei"
hash["three"] = "drei"

for v in hash.values:
  echo v

也可同時取出鍵、值對:

import tables

var hash = initTable[string, string]()

hash["one"] = "eins"
hash["two"] = "zwei"
hash["three"] = "drei"

for k, v in hash.pairs:
  echo k & ": " & v

刪除表中的元素

使用 del 方法可刪除鍵、值對,使用方式為刪除特定的鍵,該鍵、值對會一併去除,實例如下:

import tables

var hash = initTable[string, string]()

hash["one"] = "eins"
hash["two"] = "zwei"
hash["three"] = "drei"
assert(hash.hasKey("one"))

hash.del("one")
assert(hash.hasKey("one") == false)

建立有序的表

一般的表是無序的,若需要保存插入鍵、值對的順序可改用 ordered table:

import tables

var hash = initOrderedTable[string, string]()

hash["one"] = "eins"
hash["two"] = "zwei"
hash["three"] = "drei"

for k, v in hash.pairs:
  echo k & ": " & v

但 ordered table 效能會略差於一般的表,使用者需依使用情境自行考量。

關於作者

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

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