如何比较数组中的值而不考虑索引顺序

我是 Lua 的新手,喜欢使用数组但并不擅长它。我所拥有的代码是在两个数组之间简单的比较,但我想要做的是在数字和数字1之间比较数组中的任意值。如下所示,在“我的当前代码”中,两侧都应该有来自不同索引的2个数字,我想打印出“2个数字匹配!”等等。

我还想比较一个带有 {1,2,4} 的数组1 和带有 {2,1,4} 的数组2 并打印(“匹配!”)。简单的“==”无法起作用,因为它会比较索引相同的数组1和数组2中每个值。我尝试了谷歌搜索我所有的问题,但没有得到我想要的东西... 抱歉,我不久前才学会了数组

我的当前代码

local number = {5,6,7,8,9,4}
local number1 = {3,2,4,6,1}

if number == number1 then
    print(“匹配!”)
else
    print(“不匹配”)
end

期望(我想要得到的代码示例)

local array1 = {5,6,7,8,9,4}
local array2 = {3,2,4,6,1}
local array3 = {6,5,8,4,9,7}

if array1 == array2 then
    print(“匹配!”)
elseif 数组2 与数组1 相似 x 个项目
    print(x ..“匹配!”)-- 这将打印2个或更多匹配项
else
   print(“不匹配!”)
end

如果 array3 具有与 array1 的索引顺序无关的相似值,则
    print(“匹配!”)
else
   print(“不匹配!”)
end
点赞
用户6632736
用户6632736

你可以将数组转换为用 项 => true 表示的 _集合_,并使用集合运算:

local set_mt = {}

-- 集合差集 (set1 - set2):
function set_mt.__sub (set1, set2)
    local diff = {}
    for value, _ in pairs (set1) do
        if not set2 [value] then
            diff [value] = true
        end
    end
    return setmetatable (diff, set_mt)
end

-- 集合交集 (set1 ^ set2):
function set_mt.__pow (set1, set2)
    local intersect = {}
    for value, _ in pairs (set1) do
        if set2 [value] then
            intersect [value] = true
        end
    end
    return setmetatable (intersect, set_mt)
    --[[ 也可以这样写:
    return set1 - (set1 - set2)
    --]]
end

-- 集合基数 (#set):
function set_mt.__len (set)
    local len = 0
    for value, _ in pairs (set) do
        len = len + 1
    end
    return len
end

-- 集合相等 (set1 == set2):
function set_mt.__eq  (set1, set2)
    return #(set1 - set2) == 0 and #(set2 - set1) == 0
    --[[ 也可以这样写:
    return #set1 == #set2 and #(set1 ^ set2) == #set1
    --]]
end

--[[ 也可以这样写,虽然这不是任务要求:
    集合并集,作为 __add,
    笛卡尔积,作为 __mul,
    子集,作为 __le,
    序列化,作为 __tostring,
    绝对补集,如果有一个全集,但它会使一切更复杂。
--]]

local function toset (array)
    local set = {}
    for _, value in ipairs (array) do
        set [value] = true
    end
    return setmetatable (set, set_mt)
end

-- 测试:
local array1 = {5,6,7,8,9,4}
local array2 = {3,2,4,6,1}
local array3 = {6,5,8,4,9,7}

local set1, set2, set3 = toset (array1), toset (array2), toset (array3)

local x = #(set2 ^ set1)

if set1 == set2 then
    print 'array1 and array2 matched!'
elseif x >= 2 then
    print ('array2 has ' .. tostring (x) .. ' matches in array1') -- 这将打印出 2 个或更多匹配
else
    print 'No Match!'
end

if set3 == set1 then
    print 'array3 and array1 matched!'
else
    print 'No Match!'
end
2021-01-20 05:31:44