【问题标题】:How to check if an element in one multi-dimensional Ruby array exists in another?如何检查一个多维 Ruby 数组中的元素是否存在于另一个数组中?
【发布时间】:2010-11-18 10:53:22
【问题描述】:

我正在尝试确定一个多维数组中的元素是否存在于另一个类似结构的数组中。

suspects = [['Rod', 100], ['Jane', 75], ['Freddy', 125]]
criminals = [['Bill', 75], ['Ted', 50], ['Rod', 75]]

我正在寻找的答案是真或假。在上面的示例中,响应将是正确的,因为 Rod 存在于两个数组中。第二层数组中的整数值没有方位。

如何以典型的 Ruby 式简洁编写这样的测试?

【问题讨论】:

    标签: ruby arrays multidimensional-array intersection


    【解决方案1】:
    suspects.any? do |suspect, _|
      criminals.any? do |criminal, _|
        suspect == criminal
      end
    end
    

    【讨论】:

    • 谢谢,效果很好。出于兴趣,将其包装在 IF 语句中的最佳方法是什么?我只是将它放在一行上并用括号括起来。有效,但看起来有点不雅。
    • 可能值得将代码分解为一个简短的帮助函数,并具有描述性名称,例如 if (intersect(l1,l2))
    • 出于好奇,这里的下划线是做什么的?对于其他好奇的人,这里有它的文档:ruby-doc.org/core/classes/Enumerable.html#M001500
    • @Brian:从语法上讲,它只是一个变量名。 _ 通常用于表示我们不关心其值的变量。
    【解决方案2】:

    sepp2k 击败了我,但我必须提交以显示我们在实施中的接近程度:

    
    suspects.find do |suspect_name, _|
      criminals.find {|criminal_name, _| criminal_name == suspect_name}
     end 
    

    我喜欢他使用any?,但认为内部块应该是内联的:)

    【讨论】:

    • 还应该指出我的版本返回一个对象或nil,另一个使用any的理由?
    【解决方案3】:

    这样更快:

    suspects.any? {|s,_| criminals.assoc(s)}
    

    【讨论】:

      【解决方案4】:

      怎么样:

      (suspect.size + criminal.size) > (suspect | criminals).size
      

      示例:

      suspects = [['Rod', 100], ['Jane', 75], ['Freddy', 125]]
      criminals = [['Bill', 75], ['Ted', 50], ['Rod', 75]]
      
      guilty = (suspects.size + criminals.size) > (suspects | criminals).size
      # Returns false. Since no common element was found in the merging.
      
      criminals << ['Jane', 75]
      guilty = (suspects.size + criminals.size) > (suspects | criminals).size
      # Returns true. Since one element is common, merged array will be shorter by one.
      

      【讨论】:

      • 我真的很喜欢这种方法,但您可能想再次阅读问题:内容项的第二(数字)部分不用于匹配,所以这不起作用.
      【解决方案5】:

      我不一定推荐这个,但另一个单行选项(如果算上require,则为两个)可能是这样的:

      require 'set'
      (suspects.map{|s| s[0]}.to_set & criminals.map{|c| c[0]}.to_set).size > 0
      
      => true
      

      它从每个项目的第一个元素构建数组,然后将其转换为SetSet&amp; (intersect) 方法,我们会查看结果的大小来寻找答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-22
        • 2016-07-27
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多