表 (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 效能會略差於一般的表,使用者需依使用情境自行考量。