23

演示(我期望结果[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 少,但这并不能保证。

4

1 回答 1

66

-运算符应用于两个数组ab给出in的相对补码(在但不在的项目)。baab

您正在寻找的是两组的对称差异(两者之间的两个相对互补的并集)。这可以解决问题:

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

为了更有趣,您还可以在两个集合的并集中找到交集的相对集:

( a | b ) - ( a & b )  # => #<Set: {3, 9}>
于 2012-06-28T05:01:50.663 回答