如何将 GROUP B 中找到的所有元素删除到 Lua 中的 GROUP A

How to remove all elements found in GROUP B to GROUP A in Lua

假设我在 Lua 脚本中定义了两个组

groupA = {"donkey", "goat", "eagle", "whale", "dolphine", "dog", "mosquito", ...}
groupB = {"goat", "mosquito", "donkey"}

删除操作后,groupA的值没有更多元素:"goat"、"mosquito"和"donkey"

如何删除 groupA 中所有在 groupB 中找到的项目。我知道我们可以遍历项目并比较每个项目,但我更喜欢任何 API 或解决此类问题的简单内置语句。元素也可以是任何类型,如记录。

Lua 中没有计算集合差异的内置运算符。您可以执行您描述的操作并加快此过程,您可以从第二个 table 构建元素哈希,然后遍历第一个 table 中的元素并检查它们是否存在于哈希中(第二个 table 中的元素)。

如果你在迭代时最终使用table.remove从第一个table移除元素,你需要小心从末尾开始迭代,否则你可能会跳过你需要的元素删除。

您还可以检查一些建议 in this thread about set operators 是否适合您。

local lookup = {}
for i, v in ipairs(groupB) do
  lookup[v] = true
end

local answer = {}
for i, v in ipairs(groupA) do
  if (not lookup[v]) then
    table.insert(answer, v)
  end
end
  • groupB
  • 中的唯一项创建一个查找 table
  • 遍历groupA并查找查找中的每一项table
  • 将在查找 table 中找到的 groupA 的项目添加到 answer table

注意:此方法不考虑重复项。例如,如果 groupB 包含三次 "goat",而 groupA 包含四次 "goat",则 answer 将包含零次 "goat"

经过一段时间的研究,我发现 Lua 中的这个简单减法适用于组(或 table),可以从另一个组中删除在一个组中找到的元素。

例如

groupA = groupA - groupB