lua求算两个数组的交集
时间: 2023-06-22 12:42:04 浏览: 163
Lua中求两个数组的交集可以通过以下方法实现:
```lua
function intersect(a, b)
local set = {}
local res = {}
for _, v in ipairs(a) do
set[v] = true
end
for _, v in ipairs(b) do
if set[v] then
table.insert(res, v)
end
end
return res
end
-- 示例
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
c = intersect(a, b)
print(table.concat(c, ", "))
-- 输出:3, 4
```
这里使用了一个哈希表来保存数组a中出现过的元素,然后遍历数组b,如果某个元素在哈希表中也出现过,则将其添加到结果数组中。最后返回结果数组即可。
相关问题
redis zset和geo的value求交集
Redis的zset和geo类型不支持直接求交集,但是可以通过一些方法来实现。
一种方法是将zset或geo的value作为set类型的成员,然后使用Redis的sinter命令求交集。例如,假设有两个zset类型的键zset1和zset2,它们的value分别为v1、v2、v3和v2、v3、v4,可以将它们分别转化为set类型的键set1和set2,然后使用sinter命令求交集:
```
> sadd set1 v1 v2 v3
> sadd set2 v2 v3 v4
> sinter set1 set2
1) "v2"
2) "v3"
```
另一种方法是使用Redis的Lua脚本来实现交集计算。例如,假设有两个geo类型的键geo1和geo2,可以使用以下Lua脚本求它们的交集:
```
local members1 = redis.call('GEORADIUS', 'geo1', 0, 0, 10000, 'm')
local members2 = redis.call('GEORADIUS', 'geo2', 0, 0, 10000, 'm')
local result = {}
for i, member in ipairs(members1) do
if redis.call('GEOPOS', 'geo2', member) then
table.insert(result, member)
end
end
return result
```
这个脚本首先使用GEORADIUS命令获取geo1和geo2的成员,然后遍历geo1的成员,对于每个成员,使用GEOPOS命令查询它是否也是geo2的成员,如果是,则将其添加到结果中。最终,脚本返回结果数组。需要注意的是,这个脚本只适用于小规模的交集计算,对于大规模的数据集可能会出现性能问题。
阅读全文