-1

为清楚起见,编辑第二版:

我有以下哈希:

样本输入->

hashweek={[43,2011]=>[0,0,0],[44,2011]=>[0,0,0],**[45,2011]=>[0,0,0]**,[1,2012]=>[0,0,0],[2,2012]=>[0,0,0]}
timesRealCum={[43,2011]=>1000,[44,2011]=>1100,[1,2012]=>1200,[2,2012]=>1300}

预期输出->

hashweek={[43,2011]=>[1000,0,0],[44,2011]=>[1100,0,0],**[45,2011]=>[1100,0,0]**,[1,2012]=>[1200,0,0],[2,2012]=>[1300,0,0]}

假装的是,在迭代 timesRealCum 或 hashweek 或任何适当的方法时,hashweek[0] 值应更新以包含来自 timesRealCum 的相应值,或者如果未出现在 timesRealCum 哈希中,则为最后一个重要值。

4

2 回答 2

1

好的,这应该足够了:

timesRealCum.each{|k, v| hashweek[k][0] = v}

没有对 nil 值的测试,因此如果您希望在 hashweek 中缺少键,则必须测试是否hashweek[k]存在并且hashweek[k][0]

timesRealCum.each{|k, v| hashweek[k][0] = v if hashweek[k] && hashweek[k][0]}

编辑:所以如果我理解正确,如果timesRealCum 中没有条目,你想在hashweek 循环时取最后一个分配的值?

last_v = 0
hashweek.each{|k, v| last_v = v[0] = timesRealCum[k] || last_v }
于 2012-11-15T15:01:01.467 回答
0

现在,如果 timesRealCum 不包含周和年,下面的这个使用注入来保持累积值。现在它为 [45, 2011] 返回 [1100, 0, 0]。

hashweek.inject(0) do |mem, kv_pair|
  hashweek[kv_pair.first] = [timesRealCum[kv_pair.first]||mem, kv_pair.last[1..-1]].flatten
  mem = hashweek[kv_pair.first][0]
end

p hashweek
#=> {[43, 2011]=>[1000, 0, 0], [44, 2011]=>[1100, 0, 0], [45, 2011]=>[1100, 0, 0], [1, 2012]=>[1200, 0, 0], [2, 2012]=>[1300, 0, 0]}
于 2012-11-15T14:50:53.613 回答