lua - 如何比较不同的数组

我想要比较2个数组,但不知道该怎么做。

以如下为例:

local array1 = { 'friend', 'work', 'privat' }
local array2 = { 'apple', 'juice', 'privat' }

如果两个数组的值相同则应该打印出来。

我知道需要使用以下代码:

for x in ipairs(array1) do
    if x == array2 then
        print ("Hi")
    end
end

但是当然它不起作用。 那么该如何检查array1的值是否包含从array2中获取的值呢?

点赞
用户3574628
用户3574628

想象一下:你必须检查第一个数组中的每个元素与第二个数组中的相应元素。如果任何一个元素不相等,你就会知道这两个数组不相等。如果每个元素都检查通过,那么这两个数组相等。

local function arrayEqual(a1, a2)
  -- 检查长度,否则循环无效。
  if #a1 ~= #a2 then
    return false
  end

  -- 检查每个元素。
  for i, v in ipairs(a1) do
    if v ~= a2[i] then
      return false
    end
  end

  -- 检查完毕。
  return true
end
2021-03-09 18:52:50
用户3150484
用户3150484

如何检查数组1的值是否包含来自数组2的值?

@luther的答案并不总是适用于你的问题。

如果这些数组的大小不同,它就完全失败了。

如果你有一个数组,其中相似的元素不在完全相同的索引中,它可能会返回错误的负数。

例如,a = {'one', 'two'}; b = {'two', 'one'}会返回false

使用table.sort解决这个问题只是一个应急措施,而没有解决实际问题。

下面的函数可以处理包含任意顺序的元素的不同大小的数组:

function array_compare(a, b)
  for ia, va in ipairs(a) do
    for ib, vb in ipairs(b) do
      if va == vb then
        print("matching:",va)
      end
    end
  end
end

array_compare函数中,我们会遍历a和b表中的所有元素组合,比较它们,如果相等,则打印出来。

ipairs(table)使用index, value(而不仅仅是value)。

例如,

local array1 = { 'friend', 'work', 'privat' }
local array2 = { 'apple', 'juice', 'privat' }
array_compare(array1, array2)

会打印出

matching: privat
2021-03-10 18:27:35
用户3574628
用户3574628

如果你想查看array1是否包含任何与array2中相同的值,你可以进行以下操作:

  1. array1转换为一个set集合。这个set集合是一个新的表格,其中数组的值变为键,其值为true
  2. 遍历array2,查看其中任何一个值是否为集合中的键。

local set = {}
for _, v in ipairs(array1) do
  set[v] = true
end

for _, v in ipairs(array2) do
  if set[v] then
    print'Hi'
    -- 如果你只想打印一次"Hi",可以使用break语句。
  end
end

如果数组很大,这个算法应该比一个嵌套循环更快,后者需要比较array1中的每个值和array2中的每个值。

2021-03-10 20:46:26