集合運算

lua-users home
wiki

測試集合元素

集合運算可能相當有用,例如測試元素是否在集合或清單中。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 版本程式碼

對於歷史參考,以下是上述部分程式碼的 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

最新變更 · 喜好設定
編輯 · 歷程記錄
上次編輯於 2017 年 3 月 18 日星期六下午 12:09 GMT (diff)