如何在Ruby中做出理智的"设置差异"?

Zab*_*bba 18 ruby set-difference

演示(我期待结果[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!
Run Code Online (Sandbox Code Playgroud)

和:

[1,2,9] - [1,2,3] => [9]  # Hmm. Would like [[9],[3]]
Run Code Online (Sandbox Code Playgroud)

无论输入顺序如何,如何执行真正的设定差异?

PS.另外,我需要为两个2000元素数组执行此操作.通常,数组#1的元素数量少于数组#2,但这不能保证.

Jon*_*ier 56

-操作者施加到两个阵列ab给出了相对补ba(项进行a而不是在b).

您正在寻找的是两组的对称差异(两者之间的相对互补的并集).这样就可以了:

a = [1, 2, 9]
b = [1, 2, 3]
a - b | b - a          # => [3, 9]
Run Code Online (Sandbox Code Playgroud)

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

c = Set[1, 2, 9]
d = Set[1, 2, 3]
c ^ d                  # => #<Set: {3, 9}>
Run Code Online (Sandbox Code Playgroud)

为了获得额外的乐趣,您还可以在两个集合的集中找到交集的相对补集:

( a | b ) - ( a & b )  # => #<Set: {3, 9}>
Run Code Online (Sandbox Code Playgroud)