2012-06-28 21 views
14

演示(我希望結果[3]):如何在Ruby中理解「set-difference」?

[1,2] - [1,2,3] => [] # Hmm 
[1,2,3] - [1,2] => [3] # I see 

a = [1,2].to_set => #<Set: {1, 2}> 
b = [1,2,3].to_set => #<Set: {1, 2, 3}> 
a - b    => #<Set: {}> WTF! 

和:

[1,2,9] - [1,2,3] => [9] # Hmm. Would like [[9],[3]] 

如何之一,無論執行的輸入順序真正集區別?

Ps。順便說一下,我需要爲兩個2000個元素的數組執行此操作。通常情況下,數組#1的元素少於數組#2,但不能保證。

回答

49

施加到兩個陣列ab- operator給出barelative complement(項進行a但不是在b)。

你在找什麼是兩套的symmetric difference(兩者之間的相對互補的聯合)。這將這樣的伎倆:

a = [1, 2, 9] 
b = [1, 2, 3] 
a - b | b - a   # => [3, 9] 

如果您在Set對象操作,您可以使用重載^ operator

c = Set[1, 2, 9] 
d = Set[1, 2, 3] 
c^d     # => #<Set: {3, 9}> 

對於額外的樂趣,你也可以找到intersection在相對補兩組union

(a | b) - (a & b) # => #<Set: {3, 9}> 
+1

+1,很好的答案。我將Array#^添加到了我的[擴展庫](http://rubydoc.info/gems/shenanigans/1.0.4/Array#%5E-instance_method),但並不總是需要通過集合。 –