Ruby: добавление различных значений массива в хеш для одного и того же ключа - PullRequest
2 голосов
/ 17 июня 2019

Я пытаюсь добавить разные значения в массив для одного и того же ключа в хэш.Вместо создания нового экземпляра в массиве моя функция суммирует значения индекса элементов массива

def dupe_indices(array)
    hash = Hash.new([])
    array.each.with_index { |ele, idx| hash[ele] = (idx) }
    hash
end

Я получаю это

print dupe_indices(['a', 'b', 'c', 'a', 'c']) => {"a"=>3, "b"=>1, 
"c"=>4}

Ожидаемый результат

print dupe_indices(['a', 'b', 'c', 'a', 'c']) => { 'a' => [0, 3], 'b' 
=> [1], 'c' => [2, 4] }

1 Ответ

3 голосов
/ 17 июня 2019

С двумя небольшими модификациями ваш код будет работать.

  1. изменить hash = Hash.new([]) на hash = Hash.new { |h,k| h[k] = [] }

вы действительно никогда не должны использовать Hash.new([]), см. Эту статью для объяснения: https://mensfeld.pl/2016/09/ruby-hash-default-value-be-cautious-when-you-use-it/

  1. Изменить hash[ele] = (idx) на hash[ele].push(idx)

вы не хотите заменять значение всякий раз, когда вы встречаете новый индекс, вы хотите передать его в массив .

array = ['a', 'b', 'c', 'a', 'c']

def dupe_indices(array)
    hash = Hash.new { |h,k| h[k] = [] }
    array.each.with_index { |ele, idx| hash[ele].push(idx) }
    hash
end

dupe_indices(array)
# => {"a"=>[0, 3], "b"=>[1], "c"=>[2, 4]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...