2012-11-10 53 views
4

我想要相交的三個數組,但我想忽略那些空的數組。相交的非空陣列

這段代碼看起來太冗長了。有沒有更高效的方法?

if a.empty? && b.empty? 
    abc = c 
elsif a.empty? && c.empty? 
    abc = b 
elsif b.empty? && c.empty? 
    abc = a 
elsif a.empty? 
    abc = b & c 
elsif b.empty? 
    abc = a & c 
elsif c.empty? 
    abc = a & b 
else 
    abc = a & b & c 
end 
+0

那些小號是C的?他們是陣列嗎? – tokland

+0

我是這麼認爲和編輯的。我還假設'a','b'和'c'是可以或不可以空的數組。 – edgerunner

回答

11

如何

abc = [a,b,c].reject(&:empty?).reduce(:&) 

第一部分[a,b,c]把你的數組中的數組。 reject的第二位在每個元素上運行empty?,如果結果爲true,則拒絕它,返回刪除空數組的數組數組。最後一部分reduce的運行等效於您的a & b & c,但由於我們在上一步中丟棄了所有空數組,因此不會得到空的結果。

+1

+1。儘管你可以將'&'放在'reduce'中。 – tokland

+1

完美。謝謝@edgerunner – keypulsations

0

有點遲到了......

a = [1,3,4,5] 
b = [] 
c = [2,3,5,6] 

t = a | b | C# => [1, 3, 4, 5, 2, 6] 
[a,b,c].map {|e| e.empty? ? t : e}.reduce(:&) # => [3, 5]