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

时间:2011-07-02 19:41:07

标签: ruby-on-rails ruby arrays ruby-on-rails-3

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

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

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

我会检查array1array2中的值是否全部存在。 如果true中至少有一个与array1

中的值不同,我应该返回array2

如何以Ruby“好”方式编写代码?

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

4 个答案:

答案 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