How can I get the intersection, union, and subset of arrays in Ruby?
I assume X
and Y
are arrays? If so, there's a very simple way to do this:
x = [1, 1, 2, 4]y = [1, 2, 2, 2]# intersectionx & y # => [1, 2]# unionx | y # => [1, 2, 4]# differencex - y # => [4]
Utilizing the fact that you can do set operations on arrays by doing &
(intersection), -
(difference), and |
(union).
Obviously I didn't implement the MultiSet to spec, but this should get you started:
class MultiSet attr_accessor :set def initialize(set) @set = set end # intersection def &(other) @set & other.set end # difference def -(other) @set - other.set end # union def |(other) @set | other.set endendx = MultiSet.new([1,1,2,2,3,4,5,6])y = MultiSet.new([1,3,5,6])p x - y # [2,2,4]p x & y # [1,3,5,6]p x | y # [1,2,3,4,5,6]
If Multiset
extends from the Array
class
x = [1, 1, 2, 4, 7]y = [1, 2, 2, 2]z = [1, 1, 3, 7]
UNION
x.union(y) # => [1, 2, 4, 7] (ONLY IN RUBY 2.6)x.union(y, z) # => [1, 2, 4, 7, 3] (ONLY IN RUBY 2.6)x | y # => [1, 2, 4, 7]
DIFFERENCE
x.difference(y) # => [4, 7] (ONLY IN RUBY 2.6)x.difference(y, z) # => [4] (ONLY IN RUBY 2.6)x - y # => [4, 7]
INTERSECTION
x.intersection(y) # => [1, 2] (ONLY IN RUBY 2.6)x & y # => [1, 2]
For more info about the new methods in Ruby 2.6, you can check this blog post about its new features