2012-04-02 56 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