2012-06-28 7 views
14

डेमो (मैं उम्मीद [3] परिणाम):रूबी में "सेट-फर्क" कैसे करें?

[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

- operator दो सरणियों a और b के लिए आवेदन किया a में b की relative 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, अच्छा जवाब। मैंने अपनी [एक्सटेंशन लाइब्रेरी] (http://rubydoc.info/gems/shenanigans/1.0.4/Array#%5E-instance_method) में ऐरे #^जोड़ा, सेट के माध्यम से जाना हमेशा आवश्यक नहीं है। –

संबंधित मुद्दे