如何比较两个数组以确保第一个数组中的每个对象都存在于 Ruby 中的第二个数组中?

How do I compare two arrays to make sure that every object in the first array is present in the second in Ruby?

我编写了以下代码,目的是比较两个数组并确保 array1 中的每个元素都存在于 array2 中。如果一个元素不存在,它应该 return false。如果它存在,它应该 return true。

array1.each do |x|
if (array2.include?(x))
    array2.delete_at(array2.index(x))   
    next
else return false

我已将其设置为从第二个数组中删除元素以解决重复对象,但我无法确定 return 正确的位置。

我需要它遍历整个数组,当确认第一个数组中的每个元素都存在于第二个数组中时,return 为真。目前,此代码将 return 两者都存在的值组成的数组,如果输入的元素不存在于 array2 中,则返回 false。

测试array1的所有元素是否包含在array2中:

array2 | array1 == array2

编辑:删除了 Rustam A. Gasanov 指出的错误代码。

这里是你的更正方法:

def all_present_and_accounted_for?(array1,array2)
  array1.each do |x|
    if (array2.include?(x))
      array2.delete_at(array2.index(x))   
    else
      return false
    end
  end  
  true
end

array1 = [1,2,3,3,4]

array2 = [4,6,5,3,2,1,3,8]
all_present_and_accounted_for?(array1,array2) #=> true

array2 = [4,6,5,3,2,1,5,8]
all_present_and_accounted_for?(array1,array2) #=> false

您可以通过制作 array2 的副本(因此 array2 未被修改)和其他一些小的更改来改进它:

def all_present_and_accounted_for?(array1, array2)
  a2 = array2.dup
  array1.each do |n|
    return false unless i = a2.index(n)
    a2.delete_at(i)
  end
  true
end

array1 = [1,2,3,3,4]

all_present_and_accounted_for?(array1, [4,6,5,3,2,1,3,8])
  #=> true
all_present_and_accounted_for?(array1, [4,6,5,3,2,1,5,8])
  #=> false

这是另一种方法。首先,我经常想要的帮手:

class Array
  def %(arr)
    arr.each_with_object(dup) do |e,a|
      i = a.index(e)  
      a.delete_at(i) if i
    end
  end
end

例如:

arr = [38, 38, 40, 40, 40, 41, 41, 41, 41, 60]
arr % [41, 60, 40, 38, 40, 41] 
  #=> [38, 40, 41, 41]

如果a和b是两个数组,a%b类似于a-b,除了不是删除a中包含在b中的所有元素,而是删除a中的一个字符(具有最小索引的那个) b 中该字符的每个实例。现在这不是一个方便的内置方法吗?

有了这个助手,确定 array1 中的每个元素是否包含在 array2 中是一件简单的事情:

(array1 % array2).empty?

例如,

array1 = [1,2,3,3,4]
(array1 % [4,6,5,3,2,1,3,8]).empty? #=> true
(array1 % [4,6,5,3,2,1,5,8]).empty? #=> false