简体   繁体   中英

Iterate over array of array

I have an array of arrays like the following:

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

I want to rearrange it by order of elements in the inner array, eg:

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

How can I achieve this?

I know I can iterate an array of arrays like

array1.each do |bla,blo|
  #do anything
end

But the side of inner arrays isn't fixed.

p [[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]]

use transpose method on Array

a = [[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]]

Note that this only works if the arrays are of all the same length.

If you want to handle transposing arrays that have different lengths to each other, something like this should do it

class Array
  def safe_transpose
    max_size = self.map(&:size).max
    self.dup.map{|r| r << nil while r.size < max_size; r}.transpose
  end
end

and will yield the following

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM