2012-06-28 17 views
14

Demo (Tôi hy vọng kết quả [3]):Làm thế nào để làm sane "thiết lập sự khác biệt" trong Ruby?

[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! 

Và:

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

như thế nào để thực hiện một sự khác biệt thiết thực không phân biệt thứ tự của các yếu tố đầu?

Ps. Là một sang một bên, tôi cần phải làm điều này cho hai mảng phần tử 2000. Thông thường, mảng # 1 sẽ có ít phần tử hơn mảng # 2, nhưng điều này không được đảm bảo.

Trả lời

49

Các - operator áp dụng cho hai mảng ab cung cấp cho các relative complement của b trong a (các chỉ tiêu trong a nhưng không phải trong b).

Điều bạn đang tìm kiếm là symmetric difference của hai bộ (liên minh cả hai bổ sung tương đối giữa hai nhóm). Điều này sẽ làm các trick:

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

Nếu bạn đang hoạt động trên Set đối tượng, bạn có thể sử dụng quá tải ^ operator:

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

Đối vui thêm, bạn cũng có thể tìm thấy sự bổ sung tương đối của intersection trong số union của hai bộ:

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

+1, câu trả lời hay. Tôi đã thêm Array #^vào [thư viện tiện ích mở rộng] của tôi (http://rubydoc.info/gems/shenanigans/1.0.4/Array#%5E-instance_method), không phải lúc nào cũng cần phải trải qua các bộ. –

Các vấn đề liên quan