我有一个带有整数值的哈希:
h = {
a: 1,
b: 1,
c: 1,
d: 2,
e: 2,
}
我需要在第一个值上加上100
,对于第二个值及以后的值,我需要将前一个值添加到原始值中以获得:
{
a: 101,
b: 102,
c: 103,
d: 105,
e: 107,
}
有没有很好的方法来实现这一目标?
答案 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