我正在使用Ruby on Rails 3.0.7,我想检查一个数组的每个元素是否包含在另一个数组中的一组值中。
也就是说,我有这些数组:
array1 = [1,3]
array2 = [1,2,3,4,5]
我会检查array1
中array2
中的值是否全部存在。 如果true
中至少有一个与array1
array2
如何以Ruby“好”方式编写代码?
P.S。:我读过这个解决方案,但它适用于Java的数组。
答案 0 :(得分:10)
最简单的方法是做一个set intersection并看看你从中获得了什么:
intersection = array1 & array2
if intersection.length == array1.length
# Everything in array1 is in array2
end
当然,如果array1
有重复项,那将会失败,因为交集会自动压缩那些。但我们有uniq
来处理这个问题:
intersection = array1 & array2
if intersection.length == array1.uniq.length
# Everything in array1 is in array2
end
如果您希望阵列中存在重复项,那么您最好使用Set而不是数组的实例:
require 'set'
s1 = Set.new(array1)
s2 = Set.new(array2)
if((s1 & s2) == s1)
# Everything in array1 is in array2
end
或使用subset?
更好地符合您的意图:
if(s1.subset?(s2))
# Everything in array1 is in array2
end
使用集合可以解决您的重复问题,而且噪音比一直使用uniq
要少。当然,会有一些额外的开销,但你应该在性能之前优化清晰度(让它工作然后只有在速度太慢时才能使它快速)。
答案 1 :(得分:0)
includes = true
array1.each do |elem|
if !array2.include?(elem)
includes = false
end
end
您将拥有includes
变量所需的内容
答案 2 :(得分:0)
游戏后期......但是
(array2 & array1) === array1
这似乎有用......
array1.present? && (array2 & array1) === array1
如果要在数组中包含数据时返回true。
我对===运算符进行了一次尝试,因为它在rspec中运行。
答案 3 :(得分:-1)
这可以工作
newarray = array1 & array2