2012-11-15 65 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

相關問題