берет ключ словаря и возвращает массив, заполненный соответствующими значениями ключей - PullRequest
2 голосов
/ 21 марта 2020

Учитывая ха sh

person = { 
  "cats"=> 2,
  "dogs"=> 1
}

I w * sh для построения массива

["cats", "cats", "dogs"]

"cats" появляется дважды, потому что person["cats"] #=> 2. По той же причине "dogs" появляется один раз. Если бы у ha sh была третья пара ключ-значение "pigs"=>3, я бы хотел вернуть массив

["cats", "cats", "dogs", "pigs", "pigs", "pigs"]

Я попробовал следующий код.

arr = person.to_a    
i = 0
new_arr = []
while i < arr.length
  el = arr[i][0] 
  final = [new_arr << el]
  print final.flatten
  i += 1
end

Это отображает

["cats"]["cats", "dogs"] => nil

но, похоже, не возвращает значение.

new_arr
  #=> ["cats", "dogs"]

Как видите, я не получаю ответ, который хотел, и не понимаю, почему print отображает то, что я покажите выше.

Я хотел бы знать, что не так с моим кодом и что может быть лучше для этого.

Ответы [ 2 ]

2 голосов
/ 21 марта 2020

flat_map метод сведет несколько массивов в один

Оператор массива * создает массив с несколькими значениями

result = person.flat_map {|key, value| [key] * value}

# => ["cats", "cats", "dogs"]
1 голос
/ 21 марта 2020

Ruby имеет много хороших методов для работы с коллекциями. Я считаю, что лучше использовать их вместо while l oop. Вы можете перебрать ha sh, используя метод inject . Первый параметр в блоке - это результирующий массив, который накапливает результат каждой итерации, второй - пара ключ / значение.

person.inject([]) do |array, (key, value)|
  array + Array.new(value, key)
end

Или его можно переписать в одну строку.

person.inject([]) { |array, (key, value)| array + Array.new(value, key) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...