Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 从两个表中获取不相交的元素_Loops_Lua_Iteration - Fatal编程技术网

Loops 从两个表中获取不相交的元素

Loops 从两个表中获取不相交的元素,loops,lua,iteration,Loops,Lua,Iteration,我试图从两个表中获取不相交的元素。我的表当前定义为: local t1={elem5=true, elem2=true, ...} local t2={elem2=true, elem5=true, ...} 但是,将结构更改为: local t1={elem5, elem2, ...} local t2={elem2, elem5, ...} 如何有效地从两个表中获取不相交的元素?我还需要知道元素最初是哪个表的一部分 首先想到的是在两张表上循环: local fromt1={} for k

我试图从两个表中获取不相交的元素。我的表当前定义为:

local t1={elem5=true, elem2=true, ...}
local t2={elem2=true, elem5=true, ...}
但是,将结构更改为:

local t1={elem5, elem2, ...}
local t2={elem2, elem5, ...}
如何有效地从两个表中获取不相交的元素?我还需要知道元素最初是哪个表的一部分

首先想到的是在两张表上循环:

local fromt1={}
for k, v in pairs(t1) do
  if not t2[k] then
    fromt1[#fromt1+1]=v
  end
end
local fromt2={}
for k, v in pairs(t2) do
  if not t1[k] then
    fromt2[#fromt2+1]=v
  end
end
但这是两个循环,所以我又看了一些,找到了一个函数,用于在一个循环中迭代两个表():


有没有更有效/更干净的方法从Lua中的两个表中获取不相交的元素?

第一个aproach没有问题

1) 您必须以某种方式迭代这两个表;不管你是在两个循环还是一个循环中进行,这都是无关紧要的

2) 这两个结果集至少需要两个附加表

您可以做的一个优化:

表上的
#
运算符有些昂贵,因此有时可以通过保留一个数字变量并在每次插入时手动增加它来改进perofmance。但请不要因为我告诉过你就这么做。对代码进行基准测试,只有在发现代码实际运行速度更快时才使用此优化


编辑:我刚刚注意到我kida跳过了一个可能的实现,因为我假设您不想更改任何一个原始表。但是,如果其中一个是一次性表,你不介意它改变,考虑一下:

local函数从\u second(第一、第二)中删除\u first\u
对于成对键(第一个),请执行以下操作
第二[键]=零
结束
返回秒
结束
这两种方式都无法运行:

remove_first_from_second(fromt1,fromt2)--从t2中删除共享密钥
从第二个删除第一个(从t2,从t1)——从t1中不删除任何内容
因为在您第二次调用它时,
fromt2
已经只包含
fromt1
没有的键


但是,由于此问题只影响第二次调用,因此您可以在两个表之间只保留一个表(假设两个原始表都可以进行变异)

我要寻找的答案在您的编辑中。实际上我是自己来写的。事实上,可以在一个循环中从两个表中删除联合元素,并得到两个不相交元素的表。
function pairs2(t, ...)
  local i, a, k, v = 1, {...}
  return
    function()
      repeat
        k, v = next(t, k)
        if k == nil then
          i, t = i + 1, a[i]
        end
      until k ~= nil or not t
      return k, v
    end
end

local fromt1, fromt2={}, {}
for k, v in pairs2(t1, t2) do
  if not t2[k] then
    fromt1[#fromt1+1]=v
  end
  if not t1[k] then
    fromt2[#fromt2+1]=v
  end
end