如何获取两个Lua表的补集

在 Lua v. 5.2 中,如何获取两个键均为字符串类型的表的补集?

最理想的情况是编写一个函数,如下所示:

    table.complement ( t1, t2 )

返回的是一个只包含不在两个表中都存在的键的表,即补集。

我的用例是用于 NoteCase Pro 大纲软件的脚本,该软件将在执行操作将当前节点拆分为多个兄弟节点之前,获取唯一兄弟节点 ID 的“before”列表(每个 ID 都有 22 个字符),然后获取新的“after”兄弟节点 ID 列表,将该列表减少为两个列表的补集,然后将新创建的节点降级为原来当前节点的子节点或添加到层次结构中。

点赞
用户1847592
用户1847592
-- 对称差集(异或集)
local function symm_diff(t1, t2)
  local t = {}
  for k, v in pairs(t1) do
    if t2[k] == nil then 
      t[k] = v 
    end
  end
  for k, v in pairs(t2) do
    if t1[k] == nil then 
      t[k] = v 
    end
  end
  return t
end
2013-03-18 17:52:19
用户1208078
用户1208078
没有理由你不能自己写这个……像这样?

function table.complement(t1, t2) local res = {}

for _,v1 in pairs(t1) do
    local found = false
    for _,v2 in pairs(t2) do
        if (v1 == v2) then
            found = true
            break
        end
    end
    if not found then table.insert(res, v1) end
end

for _,v2 in pairs(t2) do
    local found = false
    for _,v1 in pairs(t1) do
        if (v2 == v1) then
            found = true
            break
        end
    end
    if not found then table.insert(res, v2) end
end

return res

end

local t1 = {"stuff", "more", "things"} local t2 = {"stuff", "junk", "things"}

table.foreach(table.complement(t1, t2), print)


它会打印出:

1 more 2 junk

```

2013-03-18 18:04:12