符號

2011-09-24 36 views
0

的比較2個陣列我是新來的Ruby和我一直在谷歌上搜索了幾個小時,但我不知道這一個了。它看起來應該很容易,所以我感到非常沮喪。符號

我在紅寶石工作,需要比較2個陣列的符號中的真或假的回報。

array1 = [:a, :c] 
array2 = [:a, :b, :c] 

我需要做的比較是看看array2是否包含array1的所有元素。 在這種情況下,array2包含array1,但array1不包含array2。

我想:

array2.to_s.include?(array1.to_s) 

其中僅如果它們以相同的順序,因爲它需要轉換爲字符串比較返回true。所以它返回false(不是我在找的),但是如果array2 = [:a,:c,:b],那將是真的。有沒有更適合的比較方式?

回答

1

venj的答案是適合於小數組,但可能無法正常使用(這是有爭議的)大型陣列。既然你基本上正在做一個set操作(「Set(array1)是Set(array2)的一個子集?」),看看Ruby自己的Set library是如何做到這一點是很有意義的。設置有subset? method,並採取從源頭上偷看我們可以看到,它的短期和甜:

def subset?(set) 
    set.is_a?(Set) or raise ArgumentError, "value must be a set" 
    return false if set.size < size 
    all? { |o| set.include?(o) } 
end 

我們可以只實例從陣列兩個Set對象和收工,但它只是作爲簡單的蒸餾它變成一個直接在它們上面運行的線索:

array1 = [:a, :c] 
array2 = [:a, :b, :c] 

array1.length < array2.length && array1.all? {|el| array2.include? el } 
# => true 

array1 << :z 
array1.length < array2.length && array1.all? {|el| array2.include? el } 
# => false 
+0

這就是我要找的,非常感謝你!我知道必須有一個我找不到的簡單程序。 –

1

您可以使用 - 。例如: -

array1 - array2 #=> returns empty array, if array2 include all array1 elements. 

希望這能解決你的問題。

0

您可以將此方法添加到Array類。

#!/usr/bin/env ruby 

class Array 
    def includes_other(arr) 
    raise "arr must be an Array" unless arr.kind_of? Array 
    return (arr - self).length == 0 
    end 
end 

arr1 = [:a, :c, :e] 
arr2 = [:e, :a, :c, :d] 

puts arr2.includes_other(arr1) # prints true 

arr3 = [:x, :c, :e] 

puts arr3.includes_other(arr1) # prints false 
+0

也是一個非常有趣的方法。我將不得不玩這個。 –