2015-07-11 70 views
2

我正在使用多個數組,每個數組都有一個字符串和多個整數。我已經設法在嵌套數組中設置重複項,因爲我想將它們組合在一起。因此,正如我遍歷我父陣列它輸出這樣的:組合數組和求和整數

[["word", 1, 1, 3, 4], ["word", 2, 1, 3, 4]] 

和另一個例子:

[["without", 1, 1, 3, 4], ["without", 2, 1, 3, 4], ["without", 3, 1, 0, 0]] 

我希望有一個功能將這些組合成一個陣列,總結整數。所以上面的第一個例子會變成:

["word", 3, 2, 6, 8] 

我已經嘗試了許多不同的技術,如注入和減少。我最近的嘗試並不是最優雅的:

# data is set of array 
def inject_array(data) 
    clicks = 0 
    imps = 0 
    cost = 0 
    converted_clicks = 0 
    data.each do |i| 
    clicks += i[1] 
    i[1] = clicks 
    imps += i[2] 
    i[2] = imps 
    cost += i[3] 
    i[3] = cost 
    converted_clicks += i[4] 
    i[4] = converted_clicks 
    end 

它有點亂,有沒有更清潔的方法?

+0

不知道我是否錯過了一些東西,但是不是更好地使用散列來跟蹤總和嗎? – NigoroJr

回答

4

假設陣列將永遠是相同的長度,你可以使用Array#transpose移調你從數組的數組排爲基礎,以基於列的排列:

[["word", 1, 1, 3, 4], ["word", 2, 1, 3, 4]].transpose 
=> [["word", "word"], [1, 2], [1, 1], [3, 3], [4, 4]] 

從那裏,這是不夠的瑣碎總結在每一個號碼:

[["word", 1, 1, 3, 4], ["word", 2, 1, 3, 4]].transpose.map.with_index do |e, i| 
    i == 0 ? e.first : e.inject(:+) 
end # => ["word", 3, 2, 6, 8] 
+0

我更喜歡這種方式比我自己的強力重建。 – wurde

0

你也可以在類Matrix的方法。回想一下,與r行之和的矩陣的各列中,通過由r1個行向量預乘矩陣:

require 'matrix' 

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

[a.first.first, (Matrix[[1]*a.size] * Matrix[*a.map { |e| e[1..-1] }]).to_a.first] 
    #=> ["word", [3, 2, 6, 8]] 
0

的一種方式是環的陣列上,求和部件,和重建。

word_array = [['word', 1, 1, 3, 4], ['word', 2, 1, 3, 4]] 
puts "Squashing #{word_array}..." 
i1 = 0 
i2 = 0 
i3 = 0 
i4 = 0 
word_array.each do |arr| 
    i1 += arr[1] 
    i2 += arr[2] 
    i3 += arr[3] 
    i4 += arr[4] 
end 
puts ['word', i1, i2, i3, i4].inspect