2017-02-16 12 views
0

У меня есть эти два массива:карта два рубина массивы вместе в последовательности

array1 = [1,2,3,4,5] 
array2 = ['aaa','bbb','ccc'] 

Я Перебор первого массива:

array1.each do |item| 
    puts "#{item} = #{<what I can't figure out>}"... 
end 

Я хочу, чтобы иметь возможность присвоить значения массив2 последовательно к значениям array1 в петле, так что результат блока будет:

1 = 'aaa' 
2 = 'bbb' 
3 = 'ccc' 
4 = 'aaa' 
5 = 'bbb' 

И так далее, так что второй массив циклически переходит к элементам в первом.

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

ответ

5

Попробуйте один

array1 = [1,2,3,4,5] 
array2 = ['aaa','bbb','ccc'].cycle 

array1.each do |item| 
    puts "#{item} = #{array2.next}" 
end 
+1

'array2', пожалуй, не самое лучшее название для переписчиком. :-) –

+0

Вы правы :) Предложения? Мы не знаем его содержание – Ursus

+0

'enum' обычно работает –

0

, если они имеют одинаковый размер:

array1.size.times do |i| 
    puts "#{array1[i]} = #{array2[i]}" 
end 

Легко читать и может принести распространяться на array3, так и на

+0

Я рекомендую вам использовать ['# each_index'] (https://ruby-doc.org/core-2.2.0/Array.html#method-i-each_index) или [' #each_with_index '] (http://apidock.com/ruby/Enumerable/each_with_index), но вопрос заключается в том, как сделать возможным использование массивов разного размера :) –

+0

@AlexGolubenko извините, не прочитал вопрос внимательно – Ruslan

1

Я предпочитаю использовать @Ursus' Array#cycle, но вы также можете написать следующее.

arr1 = [1,2,3,4,5] 
arr2 = ['aaa','bbb','ccc'] 

arr1.each_with_index { |item,i| puts "%i = %s" % [item, arr2[i % arr2.size]] } 
1 = aaa 
2 = bbb 
3 = ccc 
4 = aaa 
5 = bbb 
0

Использование оператора по модулю:

array1 = [1,2,3,4,5] 
array2 = ['aaa','bbb','ccc'] 

for i in (0..(array1.count-1)) 
    puts "#{array1[i]} = #{array2[i % array2.count]}" 
end 
+0

он вернется' 1 = aaa, 2 = bbb, 3 = ccc, 4 = aaa, 5 = bbb, = ccc' –

+0

Извинения. Я не видел '= ccc' в выводе терминала. Я обновил свой ответ на тот, который я дал бы, если бы увидел это. – abstractx1

1

zip может быть полезным здесь:

array1 = [1,2,3,4,5] 
array2 = ['aaa','bbb','ccc'] 

puts array1.zip(array2.cycle).map { |n,s| "#{n} = #{s}" } 
#1 = aaa 
#2 = bbb 
#3 = ccc 
#4 = aaa 
#5 = bbb 
#=> nil 
Смежные вопросы