如何在Ruby中进行合理的“集合差异”操作?

24

演示(我期望结果是[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]]

如何不考虑输入顺序执行真正的集合差异操作?

附带说明:我需要对两个2000元素数组执行此操作。通常,数组#1的元素数量会少于数组#2,但这并不保证。

1个回答

69

-运算符应用于两个数组 ab,给出的是 a 中相对于 b相对补集(即在 a 中但不在 b 中的项目)。

你需要的是两个集合的对称差集(它们之间相对补集的并集)。这将解决问题:

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

如果您正在操作Set对象,则可以使用重载的^运算符

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

为了增加趣味性,你还可以在两个集合的union中找到intersection的相对补集:

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

1
+1,好答案。我将Array#^添加到我的扩展库,不一定需要经过集合处理。 - Michael Kohl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接