1

我有一个数组:

a = [1,1,2,3,4]

还有更多数组:

b =[[1,2,3], [1,1,4], [7,3,4], [1,5,6,1]]

对于 , 中的每个元素bb_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

我在哪里可以检查返回值是否为 nil 以确定第一个问题的答案?不过,也许我可以将它们实现为两个单独的函数,这样检查是否存在这样的匹配就不需要实际返回匹配。

假设如果有很多,我只需要第一个匹配。

有没有更有效的方法来做到这一点?

4

4 回答 4

3

这可能不是更有效,但使用Enumerable#detect更像是ruby​​-esque

def get_matching(a, b)
  b.detect{ |b_i| (a & b_i) == b_i }
end
于 2012-10-26T15:17:37.917 回答
1

你忘了return nil在你的功能结束时做。

更好的方法是:

def get_matching(a, b)
   b.find do |b_i|
      (a & b_i) == b_i
   end
end

还要记住,数组相等关心元素的顺序。最好写成:

(b_i - a).empty?
于 2012-10-26T15:17:39.113 回答
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 可能是合理的。

于 2012-10-26T15:35:20.040 回答
1

这应该返回 b_i 是子集或等于 a 的所有数组:

b.select { |b_i| (b_i - a).empty? }
于 2012-10-26T20:30:03.330 回答