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

问题描述 投票:-1回答:4

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

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

我需要将100添加到第一个值,对于第二个值和on,我需要将前面的值添加到原始值以获取:

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

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

ruby hash
4个回答
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}

3
投票

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

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

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

1
投票

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

accumulated_sum = 0
h.each do |key, value|
  accumulated_sum += value
  hash[key] = 100 + accumulated_sum
end
© www.soinside.com 2019 - 2024. All rights reserved.