如何仅为一个值向数组添加累积和?

时间:2013-05-02 13:43:26

标签: ruby arrays multidimensional-array

我有一个带x和y值的数组:

[[some_date1, 1], [some_date2, 3], [some_date3, 5], [some_date4, 7]]

结果应该只对y值(1,3,5,7)求和,以便结果如下:

[[some_date1, 1], [some_date2, 4], [some_date3, 9], [some_date4, 16]]

这在Ruby中怎么可能?

5 个答案:

答案 0 :(得分:3)

是的,这在Ruby中是可行的。您可以使用[map][1]并执行以下操作:

sum = 0
array.map {|x,y| [x, (sum+=y)]}

这是它的工作原理。对于给定的输入:

array = ["one", 1], ["two", 2]

它将遍历数组中的每个元素,例如)第一个元素是["one", 1]

然后它将获取该元素(这是一个数组本身)并将变量x分配给该数组中的第一个元素,例如{}} {}和y到第二个例如{} "one"

最后,它将返回一个结果如下的数组:

1

答案 1 :(得分:3)

您可以使用map

a = [[:some_date1, 1], [:some_date2, 3], [:some_date3, 5], [:some_date4, 7]]

sum = 0
a.map { |f, v| [f, (sum = sum + v)]}

=> [[:some_date1, 1], [:some_date2, 4], [:some_date3, 9], [:some_date4, 16]]

由于sum在第一次迭代中为nil,因此需要在其上调用to_i

答案 2 :(得分:2)

a = [['some_date1', 1], ['some_date2', 3], ['some_date3', 5], ['some_date4', 7]]
a.each_cons(2){|a1, a2| a2[1] += a1[1]}

答案 3 :(得分:1)

last = 0
arr.map do |a, b|
  last = last + b
  [a, last]
end

答案 4 :(得分:1)

我会用:

ary = [['some_date1', 1], ['some_date2', 3], ['some_date3', 5], ['some_date4', 7]]
ary.inject(0) { |m, a| 
  m += a[-1]
  a[-1] = m
}

运行后,ary为:

[["some_date1", 1], ["some_date2", 4], ["some_date3", 9], ["some_date4", 16]]

我更喜欢这个的原因是它不需要添加累加器变量。 inject返回一个值,但在没有赋值的情况下它会被丢弃。