Grouping elements of an array?

S

Sam Kong

Hello,

What's the best way to do the following?

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

I want to transform the array into an array of arrays with fixed number
of elements.
I think there should be a method but I can't find it.

I can iterate the elements using a counter to divide but it's so
boring.

Thanks in advance.

Sam
 
J

Jeremy McAnally

class Array
def group_in(how_many)
ret_array = []
new_array = []
self.each {|elem| how_many.times { new_array << self.shift };
ret_array << new_array; new_array = []; }
ret_array
end
end

x = [1,2,3,4,5,6,7,8,9]
x = x.group_in(3)
require 'pp'
pp x
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

That should do it. :) Not sure if it's the best way, but it will work.

--Jeremy

Hello,

What's the best way to do the following?

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

I want to transform the array into an array of arrays with fixed number
of elements.
I think there should be a method but I can't find it.

I can iterate the elements using a counter to divide but it's so
boring.

Thanks in advance.

Sam


--
My free Ruby e-book:
http://www.humblelittlerubybook.com/book/

My blogs:
http://www.mrneighborly.com/
http://www.rubyinpractice.com/
 
F

Farrel Lifson

Hello,

What's the best way to do the following?

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

I want to transform the array into an array of arrays with fixed number
of elements.
I think there should be a method but I can't find it.

I can iterate the elements using a counter to divide but it's so
boring.

Thanks in advance.

Sam

requre 'enumerator'

[1,2,3,4,5,6,7,8,9].enum_slice(3).inject([]){|array,slice| array << slice}

Farrel
 
J

Joel VanderWerf

Farrel said:
What's the best way to do the following?

[1,2,3,4,5,6,7,8,9] => [[1,2,3],[4,5,6],[7,8,9]]
...
[1,2,3,4,5,6,7,8,9].enum_slice(3).inject([]){|array,slice| array << slice}

Alternately,

[1,2,3,4,5,6,7,8,9].enum_for:)each_slice,3).to_a
=> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
 
S

Shiwei Zhang

FYI. B is what you expect:
A=[1,2,3,4,5,6,7,8,9];B=[];
3.times {B<<A.slice!(0..2);}
 
W

William James

Farrel said:
Hello,

What's the best way to do the following?

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

I want to transform the array into an array of arrays with fixed number
of elements.
I think there should be a method but I can't find it.

I can iterate the elements using a counter to divide but it's so
boring.

Thanks in advance.

Sam

requre 'enumerator'

[1,2,3,4,5,6,7,8,9].enum_slice(3).inject([]){|array,slice| array << slice}

Farrel

requre 'enumerator'
[ 1, 2, 3, 4, 5, 6, 7, 8 ].enum_slice(3).to_aj


Without "require":
[ 1, 2, 3, 4, 5, 6, 7, 8 ].inject([[]]){|a,e|
a << [] if a.last.size==3; a.last << e; a}
 
S

Sam Kong

Hi William,

William said:
Without "require":
[ 1, 2, 3, 4, 5, 6, 7, 8 ].inject([[]]){|a,e|
a << [] if a.last.size==3; a.last << e; a}

This looks really clever.
I like it.

Sam
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,998
Messages
2,570,242
Members
46,834
Latest member
vina0631

Latest Threads

Top