如何在 Ruby 中获得数组的交集、联合和子集?

我想为一个名为 多集的类创建不同的方法。

我有所有必需的方法,但我不确定如何编写交叉、联合和子集方法。

对于交叉和联合,我的代码是这样开始的:

def intersect(var)
x = Multiset.new
end

这里有一个例子:

X = [1, 1, 2, 4]
Y = [1, 2, 2, 2]

那么 XY的交点就是 [1, 2]

135299 次浏览

我假设 XY是数组? 如果是这样,有一个非常简单的方法:

x = [1, 1, 2, 4]
y = [1, 2, 2, 2]


# intersection
x & y            # => [1, 2]


# union
x | y            # => [1, 2, 4]


# difference
x - y            # => [4]

来源

利用这个事实,您可以通过执行 &(交集)、 -(差异)和 |(联合)来对数组进行设置操作。

显然我没有实现 MultiSet to spec,但是这个应该可以让你开始:

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
end
end


x = 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]

如果 MultisetArray类扩展

x = [1, 1, 2, 4, 7]
y = [1, 2, 2, 2]
z = [1, 1, 3, 7]

工会

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]

区别

x.difference(y)      # => [4, 7] (ONLY IN RUBY 2.6)
x.difference(y, z)   # => [4] (ONLY IN RUBY 2.6)
x - y                # => [4, 7]

十字路口

x.intersection(y)    # => [1, 2] (ONLY IN RUBY 2.7)
x & y                # => [1, 2]

有关 Ruby 2.6中新方法的更多信息,可以查看 这篇博文介绍了它的新功能