Lua中删除嵌套表中的重复表

在将此问题标记为此问题的重复问题之前,请仔细阅读以下内容:

我在Lua中有一个嵌套表,类似于下面的表格,并且我想要删除其中所有重复的表格。

table1 = {{1, 2, 3}, {1, 2, 3}, {1, 2, 3, 4}}

我的目标是删除重复的表格,只使用一个表格。 结果应该像下面这样:

table2 = {{1, 2, 3}, {1, 2, 3, 4}}

我尝试了许多我在网上找到的方法以及我自己的方法,但我无法做到。

以下是我上次尝试的内容

local test = {1,2,4,2,3,4,2,3,4,"A", "B", "A"}
local hash = {}
local res = {}

for _,v in ipairs(test) do
   if (not hash[v]) then
       res[#res+1] = v -- 如果您愿意,您可以在此处打印而不是保存到结果表
       hash[v] = true
   end

end

-- 这里的test是输入,res是没有任何重复值的输出表
-- 但这仅适用于其中的值,而不适用于嵌套表。

请帮帮我。

点赞
用户2858170
用户2858170

让我们拿起笔和纸思考一下。

我们有什么?

一个包含多个表格的表格。根据您的例子,这些内部表格是序列。因此,它们只有从1开始的连续整数键。内部表格的元素可以是字符串或数字。

您想要删除重复的内部表格,即与以前的另一个表格具有相同元素的表格。

那我们该怎么做?

我们需要浏览我们的表,并检查每个元素,然后询问我们是否曾经看到过这个内部表格的内容。

所以我们列出以前看到过的序列列表。

1)检查下一个元素是否已列入列表。
2)如果在列表中,则将其删除,否则将其添加到列表中。
3)返回到1

现在将其翻译成Lua

local table1 = {{1, 2, 3}, {1, 2, 3}, {1, 2, 3, 4}}

-- 制作一个列表以添加我们已经看到的内容
local list = {}
-- 制作一个唯一项目列表,因为比从输入列表中删除项目更容易
local results = {}
-- 遍历列表并检查每个元素
for i, innerTable in ipairs(table1) do
  -- 将其转换为字符串表示法,以便轻松将其添加到我们的列表中
  local serialized = table.concat(innerTable, "\x1f")
  -- 仅当它尚未在我们的列表中时
  if not list[serialized] then
    -- 将其添加到列表中
    table.insert(results, innerTable)
    -- 将该项添加到结果列表中
    list[serialized] = true
  end
end

-- 打印结果
for i,v in ipairs(results) do print(v) end
2021-02-13 19:16:13