2011-10-16 41 views
0

儘管在嵌套哈希上存在很多問題,但我還沒有找到任何解決方案來解決我的問題。Ruby - 迭代嵌套哈希並計數值

我在拉弦和像每個字符匹配的哈希這樣:

numberOfChars = {} 
string.each_char do |c| 
    RULES.each do |key, value| 
     if c === key 
      numberOfChars[value] += 1 
     end 
    end 
end 

這工作得很好,並會輸出像「一出現3次」,直到我意識到,我的哈希需要的是嵌套,類似於這樣:

RULES = { 
    :limb { 
     :colour { 
      'a' => 'foo', 
      'b' => 'bar' 
     },   
     'c' => 'baz' 
    } 
} 

那麼我會如何去獲得'葉'鍵和它的價值?

當它迭代散列時,它還需要計算每個鍵出現的次數,例如, 'a'出現多於'b'?如果是這樣,添加一個新的散列。但是我很遺憾,在不知道它是如何迭代嵌套哈希的情況下,它在實踐中會如何工作。

在我看來,這只是過分複雜的做法,但如果任何人有任何指針,他們將非常感激!另外,如果它已經不是很痛苦了,我已經是Ruby的新手了,所以我可能會犯一些根本性的錯誤。

+0

您使用的是什麼版本的紅寶石? (ruby -v)Ruby嘗試使用RULES示例時抱怨。 –

+0

請參閱下面的示例。您在RULES設置中缺少評論。 –

+0

@NoahClark我正在使用1.9.2,你說得對,我沒有在這個例子中錯過一個逗號,我已經編輯它來包含它。 – fetimo

回答

3

你在找這樣的嗎?

RULES = { 
    :limb => { 
    :colour => { 
     'a' => 'foo', 
     'b' => 'bar' 
    }, 
    'c' => 'baz', 
    :color => { 
     'b' => 'baz' 
    } 
    } 
} 

def count_letters(hash, results = {}) 
    hash.each do |key, value| 
    if value.kind_of?(Hash) 
     count_letters(value, results) 
    else 
     results[key] = (results[key] || 0) + 1 
    end 
    end 
    results 
end 

p count_letters(RULES) 
+0

Hi @TuteC,非常感謝您的快速回復!我已經實現並調整了一下,你計算了一個字符在一個散列中出現的次數,而我需要它對一個散列中的值與一個字符進行比較(所以如果字符==鍵),並且如果它真的存在計算它,然後得到總數。我相信你的解決方案是朝着正確方向邁出的一步,但並不是那樣。我會花第二天或者這麼做:)乾杯! – fetimo