【问题标题】:Get disjoint elements from two tables从两个表中获取不相交的元素
【发布时间】:2019-12-05 11:49:38
【问题描述】:

我正在尝试从两个表中获取不相交的元素。我的表目前定义为:

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

但是这是两个循环,所以我又看了一些,发现了一个在一个循环中迭代两个表的函数(link):

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 中的两个表中获取不相交的元素吗?

【问题讨论】:

    标签: loops lua iteration


    【解决方案1】:

    第一种方法没有问题。

    1) 您必须以一种或另一种方式遍历两个表;无论您是在两个循环中还是在一个循环中执行都无关紧要。

    2) 两个结果集至少需要两个额外的表。

    您可以做的一项优化:

    表上的# 运算符有点昂贵,因此您有时可以通过保留一个数字变量并在每次插入时手动增加它来提高性能。但请不要仅仅因为我告诉过你而执行此操作。对您的代码进行基准测试,仅当您发现您的代码实际上运行得更快时才使用此优化。


    编辑:我刚刚注意到我 kida 跳过了一个可能的实现,因为我假设您不想更改任何一个原始表。但是,如果两者中的一个是一次性桌子并且您不介意对其进行更改,请考虑以下情况:

    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) -- Removes shared keys from fromt2
    remove_first_from_second(fromt2, fromt1) -- Removes nothing from fromt1
    

    因为在您第二次调用它时,fromt2 已经只包含 fromt1 没有的键。

    但是,由于此问题仅影响第二次调用,因此您可以只使用一个中间表(假设两个原始表都可以更改)

    【讨论】:

    • 我正在寻找的答案在您的编辑中。其实我是自己来写的。事实上,可以在一个循环中从两个表中删除联合元素,并获得两个不相交元素的表。
    猜你喜欢
    • 1970-01-01
    • 2018-07-08
    • 2018-05-02
    • 2019-06-28
    • 1970-01-01
    • 2021-06-29
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多