我在 lua 中有两个表(在生产中,a 有 18 个元素,b 有 8 个):
local a = {1,2,3,4,5,6}
local b = {3,5,7,8,9}
我需要返回 'a' 并省略 'b' 中的任何公共(public)元素 -- {1,2,4,6} 类似于 ruby 命令 a-b(如果 a 和 b 是数组)。
我能想到的最好的 lua 逻辑是:
local function find(a, tbl)
for _,a_ in ipairs(tbl) do if a_==a then return true end end
end
function difference(a, b)
local ret = {}
for _,a_ in ipairs(a) do
if not find(a_,b) then table.insert(ret, a_) end
end
return ret
end
local a = {1,2,3,4,5,6}
local b = {3,5,7,8,9}
local temp = {}
temp = difference(a,b)
print(temp[1],temp[2],temp[3],temp[4])
我需要快速循环比较这些表(在生产环境中每秒至少 10K 次)。有没有更简洁的方法来做到这一点?
======
这是 Redis 服务器端脚本的一部分,我必须保护我的 Redis CPU。在干净的 Lua 进程之外,我还有两个其他选择:
1.创建两个 redis 临时键,然后为 42 的 big(O) 运行 sinter
- 18 岁(a)
- 8 悲伤(b)
- 16 sinter(a,b)
2.将a和b都返回给ruby做数组比较并返回结果。
- 每秒几千个连接的后面和四分之一的网络成本将耗尽资源。
最佳答案
试试这个:
function difference(a, b)
local aa = {}
for k,v in pairs(a) do aa[v]=true end
for k,v in pairs(b) do aa[v]=nil end
local ret = {}
local n = 0
for k,v in pairs(a) do
if aa[v] then n=n+1 ret[n]=v end
end
return ret
end
关于optimization - Lua中两个表的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24621346/