如何检查一个多维Ruby数组中的元素是否存在于另一个中?

时间:2009-08-10 22:05:58

标签: ruby arrays multidimensional-array intersection

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

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

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

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

5 个答案:

答案 0 :(得分:5)

suspects.any? do |suspect, _|
  criminals.any? do |criminal, _|
    suspect == criminal
  end
end

答案 1 :(得分:3)

更快这样:

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

答案 2 :(得分:2)

sepp2k打败了我,但我必须提交以表明我们在实施方面有多接近:


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

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

答案 3 :(得分:0)

怎么样:

(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.

答案 4 :(得分:0)

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

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

=> true

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