结合数组和求和整数

时间:2015-07-11 15:36:22

标签: arrays ruby

我正在使用多个数组,每个数组都有一个字符串和多个整数。我已经设法将嵌套数组中的重复项设置在一起,因为我想要将它们组合在一起。因此,当我遍历我的父数组时,它会输出:

[["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

它变得有点凌乱,有更清洁的方式吗?

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

您还可以使用班级Matrix的方法。回想一下,要将矩阵的每一列与r行相加,请将矩阵乘以由r 1 s组成的行向量:

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]]

答案 2 :(得分: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