检查数组的每个元素是否包含在另一个数组的一组值中

Bac*_*cko 1 ruby arrays ruby-on-rails ruby-on-rails-3

我正在使用Ruby on Rails 3.0.7,我想检查一个数组的每个元素是否包含在另一个数组中的一组值中.

也就是说,我有这些数组:

array1 = [1,3]
array2 = [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

我会检查是否array1所有值都存在于array2.如果至少有一个与中的值不同,我应该返回truearray1array2

我如何以Ruby"好"方式编写代码?

PS:我读过这个解决方案,但它适用于Java的数组.

mu *_*ort 10

最简单的方法是做一个交集,看看你得到了什么:

intersection = array1 & array2
if intersection.length == array1.length
    # Everything in array1 is in array2
end
Run Code Online (Sandbox Code Playgroud)

当然,如果array1有重复,那将会失败,因为交叉点将自动压缩那些.但我们必须uniq照顾这个:

intersection = array1 & array2
if intersection.length == array1.uniq.length
    # Everything in array1 is in array2
end
Run Code Online (Sandbox Code Playgroud)

如果您希望阵列中有重复项,那么您最好使用Set而不是数组的实例:

require 'set'
s1 = Set.new(array1)
s2 = Set.new(array2)

if((s1 & s2) == s1)
    # Everything in array1 is in array2
end
Run Code Online (Sandbox Code Playgroud)

或者subset?用来更好地符合你的意图:

if(s1.subset?(s2))
    # Everything in array1 is in array2
end
Run Code Online (Sandbox Code Playgroud)

使用套装将照顾您的重复问题,而不是一直使用的噪音uniq.当然,会有一些额外的开销,但是你应该在性能之前优化清晰度(让它工作然后只有当它太慢时才能使它快速).