2011-07-02 212 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中有效。

相關問題