Grouping elements of an array?

Discussion in 'Ruby' started by Sam Kong, Jan 8, 2007.

  1. Sam Kong

    Sam Kong Guest

    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
     
    Sam Kong, Jan 8, 2007
    #1
    1. Advertisements

  2. 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
    That should do it. :) Not sure if it's the best way, but it will work.

    --Jeremy


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

    My blogs:
    http://www.mrneighborly.com/
    http://www.rubyinpractice.com/
     
    Jeremy McAnally, Jan 8, 2007
    #2
    1. Advertisements

  3. requre 'enumerator'

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

    Farrel
     
    Farrel Lifson, Jan 8, 2007
    #3
  4. 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]]
     
    Joel VanderWerf, Jan 8, 2007
    #4
  5. Sam Kong

    Shiwei Zhang Guest

    FYI. B is what you expect:
    A=[1,2,3,4,5,6,7,8,9];B=[];
    3.times {B<<A.slice!(0..2);}
     
    Shiwei Zhang, Jan 8, 2007
    #5
  6. 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}
     
    William James, Jan 8, 2007
    #6
  7. Sam Kong

    Sam Kong Guest

    Hi William,

    This looks really clever.
    I like it.

    Sam
     
    Sam Kong, Jan 8, 2007
    #7
    1. Advertisements

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 (here). After that, you can post your question and our members will help you out.