如何用另一个哈希值的数组填充哈希?

时间:2012-11-15 14:26:53

标签: ruby arrays hash key-value

为清晰起见编辑第二版:

我有以下哈希:

示例输入 - >

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哈希中,则是最后一个重要值。

2 个答案:

答案 0 :(得分: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 }

答案 1 :(得分:0)

现在,如果timesRealCum不包含周和年,则下面使用inject来保持累积值。现在它为[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]}