2011-11-13 19 views
0

我有一個散列:date => integer。我需要更改這些值,但僅限於按鍵,才能滿足要求:date1 < key < date2。什麼是一個優雅的方式來做到這一點?按鍵過濾散列並增加相應的值

+1

必須是就地更新? – tokland

+0

你是什麼意思?散列應該直接更新,而不是返回一個具有更新值的新散列。 – damluar

+0

是的,這就是我的意思,只是爲了知道你是否想要一個功能性或必要的解決方案。 – tokland

回答

2

試着這麼做:

my_hash.each {|key, value| my_hash[key] += 1 if date1 < key and key < date2 } 
+2

這不會改變'my_hash [key]',它會改變塊內的本地'value',但這個改變不會反映在'my_hash'中。 –

+0

是的,你是對的。固定! –

+1

+1修復你的錯誤:) –

1

所以,你想要做的是減少了你的哈希值。你將遍歷你的散列並檢查每個關鍵字,如果它滿足條件,你將把這個關鍵字放入一個新值中,然後修改你想要的新值。否則,密鑰會以舊值進入新散列。

hash.reduce({}) do |memo,iter| 
    if iter[0] < Time.now 
    memo[iter[0]] = iter[1] + 1 
    else 
    memo[iter[0]] = iter[1] 
    end 
    memo 
end 

這是說什麼是迭代散列。當您使用reduce對迭代散列進行迭代時,它會將每個[key,value]對傳遞給該塊。因此,iter [0]是關鍵,iter [1]是值。現在我們測試關鍵字,如果條件滿足,則更改該值並將關鍵字和新值放入新哈希中。否則,將密鑰和舊值放入哈希中。修改後的新散列返回給reduce的下一次迭代。希望這可以幫助。

+0

哦,看起來像我在寫這篇文章時,OP指定了一個可變的,非功能性的解決方案。我道歉。爲什麼需要更新就地更新? –

+0

對我來說也可以,謝謝花時間!我+1你的答案。 – damluar

+1

當迭代一個'Hash'時,你應該*真的*考慮使用解構綁定,它使得代碼更具可讀性。事實上,你必須花費整整兩句話來解釋這個問題應該是一個提示:'hash.reduce({})do | memo,(key,value)| ...結束' –