2012-05-13 2 views
4

У меня есть массив и хэшдобавляющим п элементов в массив

 
L = [] 
H = {3=>"a", 2=>"b", 1=>"c"} 

И поэтому я буду перебирать ключи, чтобы получить число раз п элемента происходит и добавить этот элемент в массив п раз

Результат

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

что такое хороший способ, чтобы написать это с Inject (или другими методами, которые я часто вижу в рубиновой коде)?

+0

Просто примечание стороны: Хэш не сохраняют порядок вставки перед Руби 1.9 (и в общие, хеш-таблицы являются неупорядоченной структурой данных), поэтому, возможно, это не правильная структура данных для вашей цели в первую очередь :) –

+2

Элементы являются сортируемыми объектами, поэтому я думаю, что могу просто сделать сортировку после этого, если Мне нужен заказ. – MxyL

+0

Достаточно справедливо, я просто хотел указать на это :) –

ответ

16
array = hash.flat_map { |k,v| [v]*k } 
+0

Aah, 'flat_map', есть что-нибудь, что вы * не можете сделать? –

+1

Ничего, никогда не видел 'flat_map' раньше. –

+0

@ JörgWMittag: Он еще не может сделать вас Pina Colada. Я думаю, что Мац работает над этим. –

2

@ Ответ Дэвида предназначен для ваших нужд. В целом, однако, вы можете добавить объект о в существующий массив п раз через один из:

# Modify the array in-place, or… 
my_array.concat([o]*n) 

# …alternatively create a new modified array 
new_array = my_array + [o]*n 
Смежные вопросы