2012-04-02 29 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も

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

それは私を与える必要があるWORD2言うべき新しいDOC3を追加した場合:

{"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

関連する問題