Lua 中的两个数组比较

假设我有两个数组

a = { "apple", "pear", "orange", "pineapple", "tomato" }
b = { "kiwi", "strawberry", "melon" }

如何比较这两个数组,并检测出在数组 b 中而不在数组 a 中的元素?

点赞
用户88888888
用户88888888

这就是我的方法:对于表 b 中的每个键(哎呀,是值),我检查每个值是否在表 a 中不存在,就像一个过滤器一样。

-- 过滤表 #1。
-- @return 一个表。
function table:filter(filterFnc)
    local result = {};

    for k, v in ipairs(self) do
        if filterFnc(v, k, self) then
            table.insert(result, v);
        end
    end

    return result;
end

-- 获得表中值的索引。
-- @param 任意值
-- @return 任意值
function table:find(value)
    for k, v in ipairs(self) do
        if v == value then
            return k;
        end
    end
end

a = { "apple", "pear", "orange", "pineapple", "tomato" };
b = { "kiwi", "strawberry", "melon" };

local additions;

-- 过滤 b 来检查新增的值
additions = table.filter(b, function(value)
    return not table.find(a, value);
end);
2016-12-10 17:26:42
用户107090
用户107090

尝试这段代码:

A = {}
for k,v in pairs(a) do
        A[v]=true
end

for k,v in pairs(b) do
        if A[v]==nil then print(v,"不在a中") end
end

如果a没有改变,你只需要构建A一次。

如果你使用了_集合_而不是_列表_,所有的事情都会变得更容易。第一个循环构建了列表a中数值的集合。

或者你可以一开始就将它们写成集合:

a = { ["apple"]=true, ["pear"]=true, ["orange"]=true, ["pineapple"]=true, ["tomato"]=true }
b = { ["kiwi"]=true, ["strawberry"]=true, ["melon"]=true}

使用集合,你不需要循环:如果k包含要测试的字符串,那么a必须是a[k]==true

2016-12-10 17:26:53