[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Grouping elements of an array?

Sam Kong

1/8/2007 5:33:00 AM

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

6 Answers

Jeremy McAnally

1/8/2007 5:51:00 AM

0

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

On 1/8/07, Sam Kong <sam.s.kong@gmail.com> wrote:
> 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...

My blogs:
http://www.mrneigh...
http://www.rubyinpra...

Farrel Lifson

1/8/2007 5:56:00 AM

0

On 08/01/07, Sam Kong <sam.s.kong@gmail.com> wrote:
> 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

Joel VanderWerf

1/8/2007 6:03:00 AM

0

Farrel Lifson wrote:
> On 08/01/07, Sam Kong <sam.s.kong@gmail.com> wrote:
>> 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]]

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Shiwei Zhang

1/8/2007 7:00:00 AM

0

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

Sam Kong wrote:

>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
>
>
>
>

William James

1/8/2007 7:23:00 AM

0

Farrel Lifson wrote:
> On 08/01/07, Sam Kong <sam.s.kong@gmail.com> wrote:
> > 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}

Sam Kong

1/8/2007 8:12:00 AM

0

Hi William,

William James wrote:
> 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