2015-07-11 69 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