删除嵌套 table 中的重复 table。 Lua

Remove duplicate tables in a nested table. Lua

在将此问题标记为 this 的重复之前,请阅读全部内容:

我在 Lua 中有一个 table,它是 table 的 table,类似于下面的内容,我想删除所有重复项 table在里面。

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

我想做的是删除重复的 table 并只使用一个。结果应该如下图

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 -- you could print here instead of saving to result table if you wanted
       hash[v] = true
   end

end

-- Here the test is the input, and res is the output table without 
-- any duplicates but this works only for values in it and not for
-- nested tables.

请帮帮我。

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

我们有什么?

一个包含多个 table 的 table。根据您的示例,那些内部 tables 是序列。所以它们只有从 1 开始的连续整数键。内部 tables 的元素要么是字符串,要么是数字。

您想删除重复的内部 table,即 table 与前面的另一个 table 具有相同的元素。

那我们该怎么办呢?

我们需要遍历我们的 table 并检查每个元素并询问我们之前是否看过这个内部 table 的内容。

所以我们列出了我们以前见过的序列。

1) Check if the next element is already on the list.
2) If it is on the list, remove it, else put it on the list.
3) back to 1 

现在将其翻译成 Lua

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

-- make a list to add what we already have seen
local list = {}
-- make a list of unique items as it is easier than removing items from our input list
local results = {}
-- go over the list and check each element
for i, innerTable in ipairs(table1) do
  -- convert it to a string representation so we add it to our list easily
  local serialized = table.concat(innerTable, "\x1f")
  -- only if it is not on our list yet
  if not list[serialized] then
    -- add it to the list
    table.insert(results, innerTable)
    -- add the item to the result list
    list[serialized] = true
  end
end

-- print the results
for i,v in ipairs(results) do print(v) end