返回具有匹配交集的数组

时间:2012-10-26 15:06:52

标签: ruby

我有一个数组:

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

更多阵列:

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

对于bb_i中的每个元素,我想知道:

  • 有一些b_ia & 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

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

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

有更有效的方法吗?

4 个答案:

答案 0 :(得分:3)

使用Enumerable#detect

可能效率不高,但 更多红宝石
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? }