我试图确定一个多维数组中的元素是否存在于另一个类似结构的数组中。
suspects = [['Rod', 100], ['Jane', 75], ['Freddy', 125]]
criminals = [['Bill', 75], ['Ted', 50], ['Rod', 75]]
我正在寻找的回应是真是假。在上面的例子中,响应是真的,因为Rod存在于两个数组中。第二层数组中的整数值没有方位。
我如何以典型的类似Ruby的简洁方式编写这样的测试?
答案 0 :(得分:5)
suspects.any? do |suspect, _|
criminals.any? do |criminal, _|
suspect == criminal
end
end
答案 1 :(得分:3)
更快这样:
suspects.any? {|s,_| criminals.assoc(s)}
答案 2 :(得分:2)
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
它从每个项目的第一个元素构建数组,然后将其转换为Set
。 Set
有&
(交叉)方法,我们会查看答案的结果大小。