2012-11-15 63 views
-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]值应该被更新以包含相应的va来自timesRealCum的提示,或者如果不存在于timesRealCum哈希中,则为最后一个有效值。

+2

要说清楚,我们可以得到样本输入和期望的输出结果吗?另外,'timesRealCum'是一个尴尬的名字选择:p –

+0

有没有timesFakeCum变量? ;) –

+0

坏笑话,但应该指出,hash_week和times_real_cum风格在Ruby代码中更为常见。 –

回答

1

好吧,这已经足够了:

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

有没有测试零值,所以如果你希望有失踪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 } 
+0

几乎是正确的,但位置散列周期[45,2011]仍然如预期的[0,0,0]而不是[1100,0,0]。感谢您的回复。 – user1826611

+0

我不知道你的意思,这改变了散列表,我将粘贴我的输出irb –

+0

是的,散列表已被更新,但那一周[45,2011]应该是[1100,0,0]。通过我的问题第一个版本,我意识到这并不明确。尝试将hashweek [0]作为timesRealCum中的值的累加器,即使该键不存在于timesRealCum – user1826611

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]} 
+0

与安东尼同样的结果,位置散列周期[45,2011]仍然是[0,0,0]而不是[1100,0,0]如预期。感谢您的回复。 – user1826611

+0

好的,但为什么hashweek [45,2011]需要[1100,0,0]而不是[0,0,0]。从描述中找不到算法。 –

+0

数组的第一个位置包含随时间推移的累计值。虽然hashweek包含所有可能的周/年,但timesRealCum可能不包含该周/年的值。 – user1826611

相关问题