集合運算 |
|
集合運算可能相當有用,例如測試元素是否在集合或清單中。Lua 沒有內建的集合運算子,但我們可以使用表格來建置它們
function contains(t, e) for i = 1,#t do if t[i] == e then return true end end return false end t = { "abc","def","ghi" } print(contains(t,"def")) --> true print(contains(t,"ddd")) --> false
這可以透過將表格 t
變為字典 (即清單元素變成金鑰) 來最佳化。例如,
t = {["abc"] = true, ["def"] = true, ["ghi"] = true} print(t["def"]) --> true (t contains "def") print(t["ddd"]) --> nil (t does not contain "def")
對於更乾淨的語法,我們可以使用函式 Set
來從清單表格建置字典表格
function Set(t) local s = {} for _,v in pairs(t) do s[v] = true end return s end function contains(t, e) return t[e] end t = Set{"abc", "def", "ghi"} print (contains(t,"def")) --> true print (t["def"]) --> true (same as above) print (contains(t,"ddd")) --> nil print (t["ddd"]) --> nil (same as above)
儘管集合依定義是未排序的,我們可能仍想擷取用於定義集合的清單中元素的索引。上述程式碼可以修改以協助這方面
function OrderedSet(t) local s = {} for i,v in ipairs(t) do s[v] = i end -- key value is index return s end function contains(t,e) return t[e] end function indexof(t,e) return t[e] end t = OrderedSet{"abc", "def", "ghi"} if contains(t,"def") then print (indexof(t,"def")) end --> 2
對於歷史參考,以下是上述部分程式碼的 Lua 4 版本。
function contains(t,e) for i=1,getn(t) do if t[i]==e then return 1 end end return nil -- element not found, return false end t = { "abc","def","ghi" } print (contains(t,"def")) -- gives you 1 (true)
function makeDict(t) local d={} for i=1,getn(t) do d[ t[i] ]=1 end return d -- return dictionary we have created end function contains(t,e) return t[e] end t = makeDict { "abc","def","ghi" } print (contains(t,"def")) -- gives you 1 (true) print (t["def"]) -- same as above
function makeDict(t) local d={} for i=1,getn(t) do d[ t[i] ]=i end -- key value is index return d end function contains(t,e) return t[e] end function indexOf(t,e) return t[e] end t = makeDict { "abc","def","ghi" } if contains(t,"def") then print (indexOf(t,"def")) end