获取两个表中不同的元素

我正在尝试从两个表中获取不同的元素。我的表格目前定义如下:

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

但这是两个循环,所以我查找了更多,并找到了一个可以在一个循环中迭代两个表格的函数(链接):

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

有没有更有效/更清晰的方法在Lua中从两个表格中获取不同的元素?

点赞
用户4984564
用户4984564

没有任何问题使用第一种方法。

  1. 无论你是否使用两个循环,你都必须迭代两个表。使用两个循环或一个循环都无关紧要。

  2. 你需要至少两个额外的表来存储两个结果集。

你可以做的一个优化:

# 运算符在表中是有一定开销的,因此有时你可以通过使用数字变量并手动增加每次插入来提高性能。但是请不要仅仅因为我告诉你而实现这个优化。基准测试你的代码,只有在你发现你的代码实际运行更快时才使用这个优化。


编辑:我刚刚注意到,我忽略了一种可能的实现方式,因为我假设你不想更改原始表之一。然而,如果其中之一是可丢弃表,而你不介意它更改,请考虑以下内容:

local function remove_first_from_second(first, second)
   for key in pairs(first) do
      second[key] = nil
   end
   return second
end

双向运行这个函数是不行的:

remove_first_from_second(fromt1, fromt2) -- 从 fromt2 删除共享键
remove_first_from_second(fromt2, fromt1) -- 从 fromt1 删除什么都不会

因为当你第二次调用时,fromt2 已经只包含 fromt1 没有的键。但是,由于这个问题只影响第二次调用,所以你只需要一个中间表就可以了(假设两个原始表都可以改变)。

2019-07-29 09:03:11