我试图确定一个多维数组中的元素是否存在于另一个类似结构的数组中。
suspects = [['Rod', 100], ['Jane', 75], ['Freddy', 125]]
criminals = [['Bill', 75], ['Ted', 50], ['Rod', 75]]
我正在寻找的答案是真或假。在上面的示例中,响应将是正确的,因为 Rod 存在于两个数组中。第二层数组中的整数值没有影响。
我如何以典型的类似 Ruby 的简洁方式编写这样的测试?
我试图确定一个多维数组中的元素是否存在于另一个类似结构的数组中。
suspects = [['Rod', 100], ['Jane', 75], ['Freddy', 125]]
criminals = [['Bill', 75], ['Ted', 50], ['Rod', 75]]
我正在寻找的答案是真或假。在上面的示例中,响应将是正确的,因为 Rod 存在于两个数组中。第二层数组中的整数值没有影响。
我如何以典型的类似 Ruby 的简洁方式编写这样的测试?
suspects.any? do |suspect, _|
criminals.any? do |criminal, _|
suspect == criminal
end
end
像这样更快:
suspects.any? {|s,_| criminals.assoc(s)}
sepp2k 击败了我,但我必须提交以显示我们在实施中的接近程度:
suspects.find do |suspect_name, _|
criminals.find {|criminal_name, _| criminal_name == suspect_name}
end
我喜欢他使用任何?,但认为内部块应该是内联的 :)
怎么样:
(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.
我不一定推荐这个,但另一个单行选项(如果算上 2 个require
)可能是这样的:
require 'set'
(suspects.map{|s| s[0]}.to_set & criminals.map{|c| c[0]}.to_set).size > 0
=> true
它从每个项目的第一个元素构建数组,然后将其转换为Set
. Set
具有&
(intersect) 方法,我们查看结果的大小以获取答案。