2015-10-26 106 views
2

我想要打印此數組中所有組合的所有不同總和[1,2,3]。我想首先將每個求和結果推送到一個新的數組b中,然後使用b.uniq將它們打印出來,以便不重複總和結果。 但是,隨着我的代碼,3重複自己,我認爲這是因爲它被推入陣列的方式b。Ruby - 將數組中的值推送到新的數組

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

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

b.push a 

b.push a.combination(2).collect {|a,b| (a+b)} 

b.push a.combination(3).collect {|a,b,c| (a+b+c)} 

puts b.uniq 
p b #[[1, 2, 3], [3, 4, 5], [6]] 

有人可以幫助我嗎?我仍然是紅寶石新手。

+0

你需要在結果中嵌套數組嗎? – nsave

+0

不,我想把它們顯示爲單獨的值.. – bisuke

+0

那麼你可以只是'p.flatten.uniq' – nsave

回答

0

如果你想要的只是一個可能的總和數組,在獲得唯一值之前將數組展平。

puts b.flatten.uniq 

發生了什麼是uniq正在運行在多維數組上。這會導致它在數組中查找重複的數組。您需要先將陣列平坦化。

3

由於任意長度的Array可使用inject(:+)被求和,我們可以創建通過遍歷範圍1..n,其中nArray的長度的更通用的解決方案。

(1..(a.size)).flat_map do |n| 
    a.combination(n).map { |c| c.inject(&:+) } 
end.uniq 
#=> [1, 2, 3, 4, 5, 6] 

使用flat_map,我們才能避免嵌套Array結果,並且可以直接調用它uniq。確保唯一性的另一個選擇是將結果傳遞給Set,爲此,Ruby在內部保證唯一性。

require "set" 

sums = (1..(a.size)).flat_map do |n| 
    a.combination(n).map { |c| c.inject(&:+) } 
end 

Set.new(sums) 
#=> #<Set: {1, 2, 3, 4, 5, 6}> 

這對於任何Array工作,只要所有元素都是Fixnum

相關問題