1

Before you mark this question as duplicate of this please read the whole thing:

I have a table in Lua which is a table of tables something like the below one and I want to remove all the duplicate tables in it.

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

What I want to do is to remove the duplicate tables and use only one. The result should be like the one below

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

I tried a lot of methods I found online and some of my own and I couldn't get to do it.

Here is what I tried last

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.

Please help me out.

Rajat Shenoi
  • 590
  • 2
  • 7
  • 22
  • besidse searching the web for solutions, did you actually think about the problem? like in taking pen and paper and writing down what you would have to do step by step? you don't need to be a programmer to solve a problem like this. – Piglet Feb 13 '21 at 09:11
  • Yes, I did, give me time till tomorrow and I’ll see if I get an answer. – Rajat Shenoi Feb 13 '21 at 09:36
  • You need to serialize `v` into string before testing `hash[ser(v)]` – Egor Skriptunoff Feb 13 '21 at 14:35

1 Answers1

1

Let's take pen and paper and think.

What do we have?

A table that contains multiple tables. According to your example those inner tables are sequences. So they only have consecutive integer keys starting from 1. The inner tables' elements are either strings or numbers.

You want to remove duplicate inner tables that is a table that has the same elements as another table before it.

So what do we have to do?

We need to go through our table and check each element and ask if we have seen this inner table's contents before.

So we make a list of sequences that we have seen before.

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 

Now translate that into 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
Piglet
  • 27,501
  • 3
  • 20
  • 43