Прежде чем пометить этот вопрос как дубликат этого, прочтите полностью:

У меня есть таблица в 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 -- 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.

Пожалуйста, помогите мне.

1
Rajat Shenoi 13 Фев 2021 в 11:04

1 ответ

Лучший ответ

Возьмем ручку и бумагу и подумаем.

Что у нас есть?

Таблица, содержащая несколько таблиц. Согласно вашему примеру эти внутренние таблицы представляют собой последовательности. Таким образом, у них есть только последовательные целочисленные ключи, начинающиеся с 1. Элементы внутренних таблиц являются либо строками, либо числами.

Вы хотите удалить повторяющиеся внутренние таблицы, то есть таблицу, в которой есть те же элементы, что и в другой таблице перед ней.

Так что же нам делать?

Нам нужно пройтись по нашей таблице, проверить каждый элемент и спросить, видели ли мы содержимое этой внутренней таблицы раньше.

Итак, мы составляем список последовательностей, которые мы видели раньше.

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
1
Piglet 13 Фев 2021 в 19:16