local a = {1, 2, 3}
local b = {1, 2, 3, 4, 5, 6}
-- I need b - a = {4, 5, 6}
我想從數組b
中刪除同樣存在於數組a
中的所有元素。尋找最快的解決方案。如何從數組B中刪除數組A中的所有元素?
local a = {1, 2, 3}
local b = {1, 2, 3, 4, 5, 6}
-- I need b - a = {4, 5, 6}
我想從數組b
中刪除同樣存在於數組a
中的所有元素。尋找最快的解決方案。如何從數組B中刪除數組A中的所有元素?
你可以在這裏使用堆棧。當只比較兩個不同的索引時,會壓入堆棧。疊加。
將較小的表反轉爲散列並在循環中與它進行比較。
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
太好了。我忘了提及每個數組實際上都是一個SET(不會有重複) - 您認爲可以用這個假設加速代碼嗎? – user606521
不是我能想到的。首先將這些集合存儲爲散列將有所幫助,因爲這意味着您可以避免反演步驟(這需要花費表迭代,表創建和表分配)。 –
這段代碼複製重複鍵到數組c
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
創建一個新表可能* *更快。 –