2011-07-02 95 views
1

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

也就是说,我有这些阵列:

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

,我会检查是否在array1值都出现在array2我应该返回true如果array1至少一种array2

是值的不同我如何代码,在Ruby“好”的方式?

P.S .:我读过这个解决方案,但它是针对Java的数组。

+3

[Ruby:数组包含在数组中,任何顺序]的可能重复(http://stackoverflow.com/questions/3897525/ruby-array-contained-in-array-any-order) –

回答

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。当然,会有一些额外的开销,但是在性能之前应该进行优化以使其清晰(使其工作,然后只在速度太慢时才使其速度更快)。

0
includes = true 

array1.each do |elem| 
    if !array2.include?(elem) 
    includes = false 
    end 
end 

而且你必须在includes变量你需要什么

+0

有一个函数抽象那个:Enumerable#all? – tokland

+0

为什么一旦找到缺失的元素就继续寻找? – baash05

-1

这可以工作

newarray = array1 & array2 
+0

对不起,它不能。 – Nakilon

0

太迟了..但

(array2 & array1) === array1 

这似乎工作..

array1.present? && (array2 & array1) === array1 

,如果你想返回,如果数组真有数据。

我对===运算符进行了刺探,因为它在rspec中有效。

相关问题