【发布时间】:2016-10-12 05:44:30
【问题描述】:
我有两张桌子:
a = {customer1:1234, customer2:3456, customer3:4567, customer4:3456}
b = {2345, 1234, 3456, 6789}
我想知道是否有一种方法可以比较表格以进行匹配。如果否,则该值将被删除。我无法找到一种方法来与值进行一对多比较。
请您告诉我如何实现这一目标?
【问题讨论】:
我有两张桌子:
a = {customer1:1234, customer2:3456, customer3:4567, customer4:3456}
b = {2345, 1234, 3456, 6789}
我想知道是否有一种方法可以比较表格以进行匹配。如果否,则该值将被删除。我无法找到一种方法来与值进行一对多比较。
请您告诉我如何实现这一目标?
【问题讨论】:
您可以使用循环逐元素比较两个表。
请阅读 Lua 参考资料。
http://www.lua.org/manual/5.3/manual.html#3.3.4 http://www.lua.org/manual/5.3/manual.html#3.3.5
简单例子
local a = {1, 2, 3}
for k, v in pairs(a) do
print(v)
end
只需用其他东西替换打印。例如,另一个循环遍历第二个表。使用两个嵌套循环允许您将一个表的每个元素与另一个表的所有元素进行比较。你可以为所欲为!
请注意
a = {customer1:1234}
会导致脚本错误。将: 替换为=
【讨论】:
#a 迭代和 a 的 #b 迭代
假设您想从两个表中删除值,我会采取以下方法:
a并将其值添加到集合s_a
b。如果一个值在s_a 中,则将其添加到集合s_b,如果没有从b 中删除。s_a = nil; collectgarbage() 释放一些内存a 并删除在s_b 中找不到的值
我的实现:
local s_a, s_b, iter_b = {}, {}, ipairs(b)
--starting with b because ipairs is a bit cheaper than pairs if done right
for k,v in iter_b do
s_b[v]=true;
end
for k,v in pairs(a) do
if s_b[v] then
s_a[v]=true
else
a[k]=nil
end
end
s_b = nil; collectgarbage()
for k,v in iter_b do
if not s_a[v] then b[k] = nil
end
【讨论】:
local iter = ipairs(b) 的操作。我稍后会编辑它。