如何检查多个Lua表是否包含相同的值?

我有一个包含多个表的表,如下所示:

local someTable = {
      idsA = {1, 2, 3, 4},
      idsB = {4, 5, 6, 7},
      idsC = {4, 8, 9, 10}
    }

现在需要检查是否存在所有子表中都存在的相同值(在这个例子中,是 4)。

点赞
用户2723873
用户2723873

看起来你需要将任意数量的表进行交集操作。我相信有一些库可以处理这个问题,但这里提供一个简单的实现:

local idTables = {
  ["idsA"] = {1, 2, 3, 4},
  ["idsB"] = {4, 5, 6, 7},
  ["idsC"] = {4, 8, 9, 10}
}

local intersection = {}
local firstTable = true
for key, tbl in pairs(idTables) do
  -- 如果这是我们浏览的第一个表,我们需要将我们的交集表作为一个映射来填充,
  -- 将出现的每个 ID 映射到一个标记。
  -- 注意 flag 布尔值的选择是相当任意的。
  if firstTable then
    for _, v in ipairs(tbl) do
      intersection[v] = true
    end
    firstTable = false
  else
    -- 否则,我们已经有了一个表来进行交集操作,因此对于我们的交集映射中的每个 ID,
    -- 让我们检查这个下一个表,看看是否对我们的交集映射中的每个元素对这个下一个表进行检查。
    for knownId,_ in pairs(intersection) do
      local newTableHasKnownId = false
      for _,id in ipairs(tbl) do
        if id == knownId then
          -- 我们正在迭代的新 ID 表确实包含我们正在查看的交集表的当前 ID。
          -- 我们可以将其标记为这样并停止查找该已知 ID。
          newTableHasKnownId = true
          break
        end
      end
      -- 如果新表没有该已知 ID,则将其从交集映射中删除。
      if not newTableHasKnownId then
        intersection[knownId] = nil
      end
    end
   end
end

print('交集结果:')
for key,_ in pairs(intersection) do
  print(key)
end
2019-03-18 07:32:06
用户3340588
用户3340588

这是一个简单的交集,可以找到所有共同的索引:

t={a={1,2,3},
   b={2,6},
   c={2,4,5}}

function intersect(m,n)
 local r={}
 for x in all(m) do
  for y in all(n) do
   if (x==y) then
    add(r,x)
    break
   end
  end
 end
 return r
end

function common_idx(t)
 local r=nil
 for k,v in pairs(t) do
  if not r then
   r=intersect(v,v)
  else
   r=intersect(r,v)
  end
 end
 return r
end

-- 2
for k,v in pairs(common_idx(t)) do
 print(v)
end
2019-03-18 07:58:54