From: "David A. Black" Date: 2005-08-29T11:25:12+09:00 Subject: Re: [Q] how to unflatten a flat-array Hi -- On Mon, 29 Aug 2005, SHIGETOMI, Takuhiko wrote: > dear guys, > > i am seeking a smart way to do ... > > [ 1, 2, 3, 4, 5, 6, ... ] => [ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ], ... ] > > especialy, the way hopefully will work safety when the source array's > size is odd or zero. I've got a method from long ago that might fit: class Array # or do it as a module, or whatever def in_slices_of(n) res = [] 0.step(size - 1, n) do |i| s = slice(i...i + n) yield s if block_given? res.push s end res end end [1,2,3,4,5,6].in_slices_of(2) # => [[1, 2], [3, 4], [5, 6]] [1,2,3,4,5,6].in_slices_of(3) # => [[1, 2, 3], [4, 5, 6]] It handles odd numbers by putting whatever's left over in its own array: [1,2,3,4,5,6,7].in_slices_of(2) # => [[1, 2], [3, 4], [5, 6], [7]] (and note that it yields each slice too). In 1.9 you can do: irb(main):015:0> [1,2,3,4,5,6].enum_slice(2).map {|x| x } => [[1, 2], [3, 4], [5, 6]] which handles odd numbers the same way. (I can't seem to get it to return the desired result without doing the map operation.) David -- David A. Black dblack@wobblini.net