2011-05-04 212 views
14

是否有任何方法來檢查數組A是否包含數組B的所有元素?Ruby - 數組A是否包含數組B的所有元素

+2

顯示要比較的數組的示例。你的意思是數組A可以包含相同元素的元素數量相同,或者只包含相同的元素和不同的數量 – fl00r 2011-05-04 22:55:55

+2

你關心重複嗎?例如,設a [1,2,3,4]和b爲[1,1,2]。回報值應該是多少? – Serabe 2011-05-05 07:33:10

回答

7

這應該對你所需要的工作:

(a & b) == b 
+4

這不會作爲一項規則。 'a = [1,2,2,1,3]; b = [3,2,1]; (a&b)== b => false' – fl00r 2011-05-04 22:53:42

+1

是的,但'a = [1,2,2,1,3]; b = [3,2,1]; (a&b).sort == b.sort => true' – 2011-05-04 23:30:34

+0

@ The Tin Man,是,但a = [1,2,2,1,3]; b = [3,2,2,1]; (a&b).sort == b.sort => false – fl00r 2011-05-17 11:24:17

18

你可以試試這個

a.sort.uniq == b.sort.uniq 

(a-b).empty? 

如果你的情況,你可以[1,2,2] != [1,2]

a.group_by{|i| i} == b.group_by{|i| i} 
+9

+1('ab).empty?' – 2011-05-04 22:59:34

+2

只是爲了防止有人在這裏結束:* *這些都是錯誤的**。正確的答案是'(b-a).empty?',而不是相反。其他人則完全錯誤。另見http://stackoverflow.com/questions/7387937/ruby-rails-how-to-determine-if-one-array-contains-all-elements-of-another-array – oseiskar 2014-05-19 13:05:31

+0

@oseiskar不,他們沒有錯。這取決於任務。 – fl00r 2014-05-19 15:26:39

2

還有Set類(標準庫的一部分),它可以讓你檢查B是否是A的一個子集。

>> a = [1,2,3,4,5]  => [1, 2, 3, 4, 5] 
>> b = [3,4,5]   => [3, 4, 5] 
>> require 'set'   => true 
>> set_a = a.to_set  => #<Set: {1, 2, 3, 4, 5}> 
>> set_b = b.to_set  => #<Set: {3, 4, 5}> 

>> set_b.subset? set_a => true 

http://www.ruby-doc.org/stdlib/libdoc/set/rdoc/index.html

6

你可以使用Ruby的Set類:

>> require 'set' #=> true 
>> a = [*1..5] #=> [1, 2, 3, 4, 5] 
>> b = [*1..3] #=> [1, 2, 3] 
>> a.to_set.superset? b.to_set #=> true 

對於小數組我通常做的一樣什麼fl00r建議:

>> (b-a).empty? #=> true 
5

我希望通過這樣做:(b - a).blank?#告訴是b包含在一個

+0

它更優雅謝謝! – RockStar 2016-01-24 11:12:39

4

最簡單的方法是這樣的:

(b-a).empty? 
相關問題