[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

group array elements in groups of two

Emmanuel Oga

9/17/2007 3:18:00 PM

A better way to do this? :

arr= [1, 2, 3, 4, 5, 6, 7, 8]
new= []
while !arr.empty?
elem1, elem2= arr.pop, arr.pop
new << [elem2, elem1];
end
new.reverse!

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

Thanks!
--
Posted via http://www.ruby-....

6 Answers

William James

9/17/2007 3:26:00 PM

0

On Sep 17, 10:18 am, Emmanuel Oga <oga_emmanuel_...@yahoo.com.ar>
wrote:
> A better way to do this? :
>
> arr= [1, 2, 3, 4, 5, 6, 7, 8]
> new= []
> while !arr.empty?
> elem1, elem2= arr.pop, arr.pop
> new << [elem2, elem1];
> end
> new.reverse!
>
> new= [[1, 2], [3, 4], [5, 6], [7, 8]]

This question has come up several times.

require 'enumerator'
==>true
[1, 2, 3, 4, 5, 6, 7, 8].enum_slice(2).to_a
==>[[1, 2], [3, 4], [5, 6], [7, 8]]

Without 'require':

f=nil
==>nil
[1, 2, 3, 4, 5, 6, 7, 8].partition{f=!f}.transpose
==>[[1, 2], [3, 4], [5, 6], [7, 8]]

Stefano Crocco

9/17/2007 3:26:00 PM

0

Alle lunedì 17 settembre 2007, Emmanuel Oga ha scritto:
> A better way to do this? :
>
> arr= [1, 2, 3, 4, 5, 6, 7, 8]
> new= []
> while !arr.empty?
> elem1, elem2= arr.pop, arr.pop
> new << [elem2, elem1];
> end
> new.reverse!
>
> new= [[1, 2], [3, 4], [5, 6], [7, 8]]
>
> Thanks!

Use each_slice:

require 'enumerator'
arr = [1, 2, 3, 4, 5, 6, 7, 8]
new = []
arr.each_slice(2){|s| new << s}

or each_slice, enum_for an inject:

require 'enumerator'
arr = [1, 2, 3, 4, 5, 6, 7, 8]
new = arr.enum_for(:each_slice , 2).inject([]){|res, c| res << c}

I hope this helps

Stefano

Farrel Lifson

9/17/2007 3:27:00 PM

0

On 17/09/2007, Emmanuel Oga <oga_emmanuel_oga@yahoo.com.ar> wrote:
> A better way to do this? :
>
> arr= [1, 2, 3, 4, 5, 6, 7, 8]
> new= []
> while !arr.empty?
> elem1, elem2= arr.pop, arr.pop
> new << [elem2, elem1];
> end
> new.reverse!
>
> new= [[1, 2], [3, 4], [5, 6], [7, 8]]
>
> Thanks!
irb(main):012:0> require 'enumerator'
=> true
irb(main):013:0> new = []
=> []
irb(main):014:0> [1,2,3,4,5,6].each_slice(2) do |slice|
irb(main):015:1* new << slice
irb(main):016:1> end
=> nil
irb(main):017:0> new
=> [[1, 2], [3, 4], [5, 6]]

James Gray

9/17/2007 3:27:00 PM

0

On Sep 17, 2007, at 10:18 AM, Emmanuel Oga wrote:

> A better way to do this? :
>
> arr= [1, 2, 3, 4, 5, 6, 7, 8]
> new= []
> while !arr.empty?
> elem1, elem2= arr.pop, arr.pop
> new << [elem2, elem1];
> end
> new.reverse!
>
> new= [[1, 2], [3, 4], [5, 6], [7, 8]]

>> a = (1..8).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8]
>> require "enumerator"
=> true
>> a.enum_slice(2).to_a
=> [[1, 2], [3, 4], [5, 6], [7, 8]]

Hope that helps.

James Edward Gray II

Sebastian Hungerecker

9/17/2007 3:31:00 PM

0

Stefano Crocco wrote:
> require 'enumerator'
> arr = [1, 2, 3, 4, 5, 6, 7, 8]
> new = arr.enum_for(:each_slice , 2).inject([]){|res, c| res << c}

You can simply replace the inject with a call to to_a:
new = arr.enum_for(:each_slice , 2).to_a


--
NP: The Haunted - DOA
Jabber: sepp2k@jabber.org
ICQ: 205544826

Emmanuel Oga

9/17/2007 3:37:00 PM

0

very usefull. Thank you!
--
Posted via http://www.ruby-....