Ruby 将上一个值添加到每个哈希值

Ruby 将上一个值添加到每个哈希值,ruby,hash,Ruby,Hash,我有一个包含整数值的散列: h = { a: 1, b: 1, c: 1, d: 2, e: 2, } 我需要将100添加到第一个值,对于第二个值,我需要将前面的值添加到原始值,以获得: { a: 101, b: 102, c: 103, d: 105, e: 107, } 有没有一个好的方法来实现这一点?您可以使用它来计算总金额: h = { a: 1, b: 1, c: 1, d: 2, e: 2} h.inject(100) { |s, (k,

我有一个包含整数值的散列:

h = {
  a: 1,
  b: 1,
  c: 1,
  d: 2,
  e: 2,
}
我需要将
100
添加到第一个值,对于第二个值,我需要将前面的值添加到原始值,以获得:

{
  a: 101,
  b: 102,
  c: 103,
  d: 105,
  e: 107,
}
有没有一个好的方法来实现这一点?

您可以使用它来计算总金额:

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}

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

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

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

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

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

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

您的问题是无法运行
。每个
,还是需要算法本身的帮助?我在问是否有更好的ruby方法来实现这一点@elvinasTime对您的问题并不重要。你需要简化散列来表达你的观点。这叫做前缀和或扫描,Ruby的集合库中确实奇怪地缺少了它。除非你有充分的理由这样做,假设散列键有特定的顺序通常不是一个好主意。我根据我对问题的编辑编辑了你的答案。这个问题有很多伪装,一个是将离散概率密度函数转换为累积分布函数。你提供了一个很好的方法。这是第一次:你的答案被编辑了吗?@CarySwoveland-ha!我通常是编辑答案以包含链接的人:-)看起来我很匆忙。