我正在使用 Ruby on Rails 3.0.7,我想检查一个数组的每个元素是否包含在另一个数组中存在的一组值中。
也就是说,我有这些数组:
array1 = [1,3]
array2 = [1,2,3,4,5]
我会检查 array1
中的值是否都存在于 array2
中。 如果至少有一个 array1
与 array2
true
我怎样才能以“好的”Ruby 方式编写代码?
P.S.:我读过这个解决方案,但它是针对 Java 数组的。
最佳答案
最简单的事情是做一个 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
相比,使用 sets 将以更少的干扰处理您的重复问题。当然,会有一些额外的开销,但您应该在性能之前优化清晰度(让它工作,然后只有当它太慢时才让它变快)。
关于ruby-on-rails - 检查数组的每个元素是否包含在另一个数组的一组值中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6559208/