2011-10-16 2 views
0

내포 된 해시에 대한 많은 질문이 있지만 내 문제에 대한 해결책을 찾지 못했습니다.루비 - 중첩 해시 반복 및 값 계산

나는 문자열에 당겨과 같이 해시에 각 문자를 일치 해요 :

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'보다 더 많이 나타 납니까? 그렇다면 새 해시에 a를 추가하십시오. 하지만 실제로는 중첩 해시를 반복하는 방법을 모른 채 실제로 작동하는 방법에 대해서는별로 모르겠다.

나에게이 작업을 수행하는 지나치게 복잡한 방식이지만 누군가 포인터가 있다면 대단히 감사하게 생각할 것입니다!

또한 이미 고통스럽지 않은데 이미 Ruby를 처음 접했을 때 나는 근본적인 실수를 저지르고있을 것입니다.

+0

사용중인 루비 버전은 무엇입니까? (ruby -v) RULES 예제를 사용하려고하면 Ruby가 불평합니다. –

+0

아래 예를 참조하십시오. 규칙 설정에 댓글이 없습니다. –

+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

안녕하세요 @ TuteC, 대단히 빠른 답장을 보내 주셔서 감사합니다! 나는 이것을 구현하고 약간 조정했다. 해시 값에 대해 문자를 비교할 필요가있는 반면 (문자 == 키인 경우) 문자가 해시에 표시되는 횟수를 계산하고, 그렇다면 그것을 세고 합계를 구하십시오. 나는 당신의 솔루션이 올바른 방향으로 나아가는 단계이지만 확실하지는 않다는 것을 확신합니다. 나는 그 다음날을 보낼 것이다, 또는 그것에 그것에 맞붙어서 :) 건배! – fetimo