2012-04-02 103 views
2

我試圖做以下說;修改ruby中的內部散列

我有一個哈希:{"word1" => {"doc1" => 1, "doc2" => 1}}

現在,當我插入我通過這個詞本身就帶有文件ID例如哈希一個新詞WORD2和DOC2應該給我:

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

如果我現在補充:字1和文檔1應該給我:

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

注:DOC1的價值增加了​​1

和WORD2和DOC2

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

此外,如果添加一個新的doc3的說單詞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 2012-04-02 01:12:11

+0

@bytebiscuit:固定。 – 2012-04-02 01:15:02

+0

「Hash :: new」的塊形式非常神奇。我應該先查找API! – DigitalRoss 2012-04-02 01:23:51

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 2012-04-02 01:29:24