我有一个数组:
a = [1,1,2,3,4]
更多阵列:
b =[[1,2,3], [1,1,4], [7,3,4], [1,5,6,1]]
对于b
,b_i
中的每个元素,我想知道:
b_i
,a & b_i == b_i
和b_i
这就是我的想法
def get_matching(a, b)
b.each {|b_i|
return b_i if (a & b_i) == b_i
}
end
在哪里可以检查返回值是否为零以确定第一个问题的答案?虽然,也许我可以将它们实现为两个独立的函数,以便检查是否存在这样的匹配不需要实际返回匹配。
假设我只需要第一次匹配,如果有很多。
有更有效的方法吗?
答案 0 :(得分:3)
def get_matching(a, b)
b.detect{ |b_i| (a & b_i) == b_i }
end
答案 1 :(得分:1)
你忘了在功能结束时return nil
。
更好的方法是:
def get_matching(a, b)
b.find do |b_i|
(a & b_i) == b_i
end
end
还要记住,数组相等性关心元素的顺序。写一下可能更好:
(b_i - a).empty?
答案 2 :(得分:1)
在我看来,有理由使用Ruby Set
require 'set'
def get_matching(a,b)
a = a.to_set
b.detect { |b_i| b_i.to_set.subset?(a) }
end
当然这不是最短的答案,但如果你有很多类似的任务,那么使用Set可能是合理的。
答案 3 :(得分:1)
这应该返回所有数组,其中b_i是子集或等于:
b.select { |b_i| (b_i - a).empty? }