2012-10-26 64 views
1

我有一個數組:返回具有匹配相交陣列

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 

我在哪裏可以檢查返回值是否爲nil或者沒有確定的答案,第一個問題?雖然,也許我可以將它們作爲兩個單獨的函數來實現,以便檢查這種匹配是否存在並不需要實際返回匹配。

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

有沒有更有效的方法來做到這一點?

回答

3

這可能不是任何更有效,但它使用Enumerable#detect

def get_matching(a, b) 
    b.detect{ |b_i| (a & b_i) == b_i } 
end 
1

你忘了你的函數的末尾做return nil多一點紅寶石去年秋季。

更好的方法是:

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

而且記住,數組平等關心元素的順序。這可能是更好的寫:

(b_i - a).empty? 
+0

所以會比較喜歡'((A&b_i) - b_i).empty'忽略秩序?謝謝我沒有考慮元素的順序。 – MxyL

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 

當然這不是最簡單的回答,但如果你有很多相似的任務,然後使用設置可以是合理的。

1

這應該所有陣列,其中b_i是一個子集或等於返回到:

b.select { |b_i| (b_i - a).empty? } 
+0

謝謝,這也會很有用! – MxyL

相關問題