【问题标题】:rails - Finding intersections between multiple arraysrails - 查找多个数组之间的交叉点
【发布时间】:2010-07-07 17:47:23
【问题描述】:

我正在尝试查找多个数组之间的交集值。

例如

code1 = [1,2,3]
code2 = [2,3,4]
code3 = [0,2,6]

所以结果是 2

我知道在 PHP 中你可以使用 array_intersect 来做到这一点

我希望能够轻松添加额外的数组,所以我真的不想使用多个循环

有什么想法吗?

谢谢,亚历克斯

【问题讨论】:

    标签: ruby-on-rails ruby arrays array-intersect


    【解决方案1】:

    使用Array&方法,用于设置交集。

    例如:

    > [1,2,3] & [2,3,4] & [0,2,6]
    => [2]
    

    【讨论】:

    • @Anurag 你确定这行得通吗?除非我误解了 OP 的要求,否则不会对第一个和最后一个数组进行交叉测试。例如,[1,2,3] & [4,5,6] & [1,2,3] 返回一个空数组。
    • @Cyle 三路交集结果中的任何元素都应该存在于所有三个操作数中。见en.wikipedia.org/wiki/Intersection_(set_theory)
    【解决方案2】:

    如果你想用一种更简单的方法来处理未知长度的数组,你可以使用inject。

    > arrays = [code1,code2,code3]
    > arrays.inject(:&)                   # Ruby 1.9 shorthand
    => [2]
    > arrays.inject{|codes,x| codes & x } # Full syntax works with 1.8 and 1.9
    => [2]
    

    【讨论】:

    • arrays.inject(:&) 在 1.9 中不起作用。这将通过arrays.inject(:'&') 起作用
    【解决方案3】:

    Array#intersection (Ruby 2.7+)

    Ruby 2.7 引入了Array#intersection 方法来匹配更简洁的Array#&

    所以,现在,[1, 2, 3] & [2, 3, 4] & [0, 2, 6] 可以用更详细的方式重写,例如

    [1, 2, 3].intersection([2, 3, 4]).intersection([0, 2, 6])
    # => [2]
    
    [1, 2, 3].intersection([2, 3, 4], [0, 2, 6])
    # => [2]
    

    【讨论】:

    • 两种方法一样吗?
    • @Christopher Oezbek,差不多。如果您在文档中单击“单击以切换源”,您将看到“交叉点”在后台调用“&”。
    猜你喜欢
    • 1970-01-01
    • 2016-02-22
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多