2016-10-31 5 views
6

В следующем массив содержит два массива каждый из которых имеет 5 целочисленных значений:Комбинирование массивы в Ruby,

[[1,2,3,4,5],[6,7,8,9,10]] 

я хочу, чтобы объединить их таким образом, что он генерирует пять различных массивов путем объединения значений обоих массивов с индексом 0 , 1 .. дО 4.

Результат должен быть таким:

[[1,6],[2,7],[3,8],[4,9],[5,10]] 

есть ли простой способ сделать это?

ответ

9

Как насчет transpose?

a = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]] 
#=> [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]] 

a.transpose 
#=> [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]] 

этот метод также может помочь вам в будущем, например:

a = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]] 
#=> [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]] 

a.transpose 
#=> [[1, 6, 11], [2, 7, 12], [3, 8, 13], [4, 9, 14], [5, 10, 15]] 
+0

Да, это работает, и поможет в будущем. – Arif

5
a = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]] 
a.first.zip(a.last) 
2

Если вы уверены, что ваши суб массивы имеют одинаковую длину, вы можете использовать Array#transpose:

[[1,2,3,4,5],[6,7,8,9,10]].transpose 
#=> [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]] 

В качестве бонуса он отлично работает с более чем двумя массивами:

[[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]].transpose 
#=> [[1, 6, 11], [2, 7, 12], [3, 8, 13], [4, 9, 14], [5, 10, 15]] 

Если вы не уверены, ваши суб массивы имеют одинаковую длину:

[[1,2,3,4,5],[6,7,8,9], [10,11]].reduce(&:zip).map(&:flatten) 
#=> [[1, 6, 10], [2, 7, 11], [3, 8, nil], [4, 9, nil], [5, nil, nil]] 

Использование транспонировать в этом примере будет сгенерировано IndexError.

1

Использование параллельного назначения:

a, b = [[1, 2, 3, 4, 5],[6, 7, 8, 9, 10]] 
a.zip b #=> [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]] 
Смежные вопросы