【问题标题】:lua - how to compare different arraylua - 如何比较不同的数组
【发布时间】:2021-06-07 14:38:11
【问题描述】:

我正在尝试比较 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 的值​​?

【问题讨论】:

    标签: lua


    【解决方案1】:

    这样想:您必须将第一个数组中的每个元素与第二个数组中的对应元素进行检查。如果任何元素不相等,您就会立即知道数组不相等。如果每个元素都检查为相等,则数组是相等的。

    local function arrayEqual(a1, a2)
      -- Check length, or else the loop isn't valid.
      if #a1 ~= #a2 then
        return false
      end
    
      -- Check each element.
      for i, v in ipairs(a1) do
        if v ~= a2[i] then
          return false
        end
      end
      
      -- We've checked everything.
      return true
    end
    

    【讨论】:

    • 就是这样!以防万一,如果两个表中值的顺序是随机的,但它们仍然应该是等价的,那么两个表应该在比较长度后按字母顺序排序。这是传递给 table.sort 的快速函数:stackoverflow.com/a/48189296/12135804>
    【解决方案2】:

    如何检查 array1 值是否包含来自 array2 的值​​?

    @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
    

    【讨论】:

    • 这个问题的最简单解释是他们想知道两个数组是否完全相等(“如果两个数组具有相同的值......”),在这种情况下我确定我的答案是正确的。您的解释可能是有效的,但 OP 必须在我们知道之前添加一些说明。
    【解决方案3】:

    (我正在写第二个答案以解释对问题的另一种可能解释。)

    如果您想查看array1 是否包含array2 中的任何值,您可以执行以下操作:

    1. array1 转换为一个集合。集合是一个新表,其中数组的值成为键,其值为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'
        -- Use a break statement if you only want to say hi once.
      end
    end
    

    如果数组很大,该算法应该比将array1 中的每个值与array2 中的每个值进行比较的嵌套循环更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 2022-01-10
      • 2016-02-24
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多