将先前的值添加到每个哈希值

时间:2019-02-19 11:03:48

标签: ruby hash

我有一个带有整数值的哈希:

h = {
  a: 1,
  b: 1,
  c: 1,
  d: 2,
  e: 2,
}

我需要在第一个值上加上100,对于第二个值及以后的值,我需要将前一个值添加到原始值中以获得:

{
  a: 101,
  b: 102,
  c: 103,
  d: 105,
  e: 107,
}

有没有很好的方法来实现这一目标?

4 个答案:

答案 0 :(得分:6)

您可以使用inject来计算总和:

h = { a: 1, b: 1, c: 1, d: 2, e: 2}

h.inject(100) { |s, (k, v)| s + v }
#=> 107

在这样做的同时,您还可以设置哈希值以获得累计和:

h.inject(100) { |s, (k, v)| h[k] = s + v }

h #=> {:a=>101, :b=>102, :c=>103, :d=>105, :e=>107}

答案 1 :(得分:3)

您可以将总和作为外部变量进行跟踪:

sum = 100
h.transform_values{|v| sum += v} # => {:a=>101, :b=>102, :c=>103, :d=>105, :e=>107}

答案 2 :(得分:3)

不修改输入的不变解决方案:

h.each_with_object({sum: 100, outcome: {}}) do |(k, v), acc|
  acc[:outcome][k] = acc[:sum] += v
end
#⇒ {:sum=>107, :outcome=>{:a=>101, :b=>102, :c=>103, :d=>105, :e=>107}}

答案 3 :(得分:1)

也许这不是最有效的解决方案,但绝对是不错的可读性。

accumulated_sum = 0
h.each do |key, value|
  accumulated_sum += value
  hash[key] = 100 + accumulated_sum
end