2

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

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

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

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

4

5 回答 5

5
suspects.any? do |suspect, _|
  criminals.any? do |criminal, _|
    suspect == criminal
  end
end
于 2009-08-10T22:11:44.273 回答
3

像这样更快:

suspects.any? {|s,_| criminals.assoc(s)}
于 2009-08-11T01:46:38.303 回答
2

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


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

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

于 2009-08-10T22:14:40.103 回答
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.
于 2009-08-11T06:33:34.303 回答
0

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

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

=> true

它从每个项目的第一个元素构建数组,然后将其转换为Set. Set具有&(intersect) 方法,我们查看结果的大小以获取答案。

于 2009-08-11T08:19:12.423 回答