изменение внутренних хэшей в ruby - PullRequest
2 голосов
/ 02 апреля 2012

Я пытаюсь сделать следующее:

У меня есть хеш: {"word1" => {"doc1" => 1, "doc2" => 1}}

Теперь, когда я вставляю новое слово в хэш, я передаю само слово с помощьюидентификатор документа, например, word2 и doc2, который должен дать мне:

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

Если я теперь добавлю: word1 и doc1, он должен дать мне:

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

Примечание: значение doc1 увеличилось на 1

и для word2 и doc2

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

также, если добавить новый doc3 для слова word2, это должно дать мне:

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

Как мне этого добиться!?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012
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}}

Конечно, вы можете инкапсулировать это в функцию, если хотите.

1 голос
/ 02 апреля 2012
@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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...