2012-04-02 3 views
2

다음과 같이 말하려고합니다. 내가 예를 들어, 문서 ID로 단어 자체를 전달하는 해시에 새로운 단어를 삽입 할 때 지금 {"word1" => {"doc1" => 1, "doc2" => 1}}루비의 내부 해시 수정하기

:

나는 해시가 지금 추가하는 경우

{"word1" => {"doc1" => 1, "doc2" =>1}, "word2" => {"doc2" => 1}} 

: 단어 1을하고 나에게 주어야한다 DOC1 : word2 및 doc2 나에게 제공해야하는

{"word1" => {"doc1" => 2, "doc2" =>1}, "word2" => {"doc2" => 1}} 

참고 : DOC1의 값은 1

에 의해 word2에 대한 증가 및 doc2

그것은 나를 주어야한다 word2 말 새로운 doc3을 추가하는 경우도
{"word1" => {"doc1" => 2, "doc2" =>1}, "word2" => {"doc2" => 2}} 

:

{"word1" => {"doc1" => 2, "doc2" =>1}, "word2" => {"doc2" => 2, "doc3" => 1}} 

어떻게해야합니까?!

답변

2
irb(main):005:0> words = Hash.new { |h,k| h[k] = Hash.new(0) } 
irb(main):006:0> words["word1"]["doc1"] += 1 
irb(main):007:0> words["word1"]["doc1"] += 1 
irb(main):008:0> words["word2"]["doc2"] += 1 
irb(main):009:0> words 
=> {"word1"=>{"doc1"=>2}, "word2"=>{"doc2"=>1}} 

원하는 경우 원하는 기능으로 캡슐화 할 수 있습니다.

+0

처음에는 해시가 비어 있다고 가정합니다. – bytebiscuit

+0

@bytebiscuit : 수정되었습니다. –

+0

'Hash :: new'의 블럭 형태는 정말로 마술 적입니다. 우선 API를 찾았어야 했어! – DigitalRoss

1
@h = {} 

def addword word, doc 
    inner = @h[word] || {} 
    @h[word] = inner.merge(doc => (inner[doc] || 0) + 1) 
    p [:hash_is_now, @h] 
end 

addword 'word1', 'doc1' 
addword 'word1', 'doc2' 
addword 'word2', 'doc2' 
addword 'word1', 'doc1' 
addword 'word2', 'doc2' 
addword 'word2', 'doc3' 
+0

감사합니다. DR, 다른 대안을 알아두면 좋습니다! – bytebiscuit