local a = {1, 2, 3}
local b = {1, 2, 3, 4, 5, 6}
-- I need b - a = {4, 5, 6}
Я хочу удалить все элементы из массива b
, которые также присутствуют в массиве a
. Ищете решение FASTEST.Как удалить все элементы в массиве A из массива B?
local a = {1, 2, 3}
local b = {1, 2, 3, 4, 5, 6}
-- I need b - a = {4, 5, 6}
Я хочу удалить все элементы из массива b
, которые также присутствуют в массиве a
. Ищете решение FASTEST.Как удалить все элементы в массиве A из массива B?
вы можете использовать стек здесь. когда просто сравниваете два индекса, которые не являются одинаковыми нажатиями в стек. стек.
Не может быть так, потому что оба элемента массивов могут не сортироваться, а длина «а» может быть также больше длины «b» – user606521
, тогда вы можете использовать быструю сортировку .... –
длина двух массивов Здесь неважно. –
Инвертировать меньшую таблицу в хэш и сравнивать с ней в цикле.
function invtab(t)
local tab = {}
for _, v in ipairs(t) do
tab[v]=true
end
return tab
end
local a = {1, 2, 3}
local b = {1, 2, 3, 4, 5, 6}
local ainv = invtab(a)
-- To get a new table with just the missing elements.
local ntab = {}
for _, v in ipairs(b) do
if not ainv[v] then
ntab[#ntab + 1] = v
end
end
-- To remove the elements in place.
for i = #b, 1, -1 do
local v = b[i]
if ainv[v] then
table.remove(b, i)
end
end
Wow большой. Я забыл упомянуть, что каждый массив будет SET на самом деле (там не будет дубликатов) - как вы думаете, можно ускорить код с этим предположением? – user606521
Не то, чтобы я мог думать. Хранение наборов как хэшей в первую очередь поможет, так как это означает, что вы можете избежать шага инверсии (который стоит за итерацией таблицы, созданием таблицы и распределением таблиц). –
Этот код копирует дубликаты ключей к массиву гр
local a = {1, 2, 3}
local b = {1, 2, 3, 4,5 ,6}
local c = {}
for k,v in ipairs(b) do
local foundkey = false
for _k,_v in ipairs(a) do
if _v == v then
foundkey = true
end
end
if foundkey then
table.insert(c,v)
end
end
Или
local a = {1, 2, 3}
local b = {1, 2, 3, 4, 5, 6}
for k,v in ipairs(b) do
local key = 0
for _k,_v in ipairs(a) do
if _v == v then
key = _k
end
end
if key ~= 0 then
table.remove(a,key)
end
end
-- Outputs a = {7}
или
local a = {1, 2, 3}
local b = {1, 2, 3, 4, 5, 6}
local c = {}
for k,v in ipairs(b) do
local foundkey = 0
for _k,_v in ipairs(a) do
if _v == v then
foundkey = _k
end
end
if foundkey == 0 then
table.insert(c,v)
end
end
a = c
-- Output a = {4, 5, 6}
Хотите удалить на месте или создать новый таблица с только отсутствующими элементами? –
Более быстрый подход. В каждой таблице может быть ~ 100-1000 элементов. – user606521
Создание новой таблицы, вероятно, будет * намного быстрее. –