我编写了以下代码,目的是比较两个数组并确保array1中的每个元素都存在于array2中。如果元素不存在,则应返回 false。如果存在,则应返回 true。
array1.each do |x|
if (array2.include?(x))
array2.delete_at(array2.index(x))
next
else return false
我已经将其设置为从第二个数组中删除元素以考虑重复的对象,但我无法弄清楚在哪里返回 true。
我需要它遍历整个数组,并在确认第一个数组中的每个元素都存在于第二个数组中时返回 true。目前,此代码将返回一个值的数组,如果输入 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,不同之处在于它不会删除 b 中包含的所有元素,而是删除 b 中该字符的每个实例的 a(索引最小的字符)中的一个字符。现在,这不是一种方便的内置方法吗?
使用此帮助程序,确定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