【问题标题】:How to do sane "set-difference" in Ruby?如何在 Ruby 中做合理的“设置差异”?
【发布时间】:2012-06-29 14:18:33
【问题描述】:

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

【问题讨论】:

    标签: ruby set-difference


    【解决方案1】:

    应用于两个数组ab- operatora 中给出brelative complement(在a 中但不在b 中的项目)。

    您正在寻找的是两个集合的symmetric difference(两者之间的两个相对补码的并集)。这样就可以了:

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

    如果你对Set对象进行操作,你可以使用重载的^ operator

    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,很好的答案。我将 Array#^ 添加到我的 extension library,并不总是需要遍历集合。
    猜你喜欢
    • 1970-01-01
    • 2019-05-12
    • 2010-10-23
    • 2023-04-11
    • 2019-09-18
    • 1970-01-01
    • 2023-03-07
    • 2013-07-05
    相关资源
    最近更新 更多