Array resizing

Discussion in 'Ruby' started by Victor Shepelev, Mar 28, 2006.

  1. Maybe dumb question, but...

    I have not found anything like Array.resize, i.e.

    a = [1,2]

    a.resize(5) #=> [1,2,nil,nil,nil]
    a.resize(5, 3) #=> [1,2,3,3,3]

    I can use Array.fill, but

    a.fill(3, a.size, a.size+2)

    looks a bit ugly, not?

    Moreover, if I want to resize to size lesser then array is, I need slice.

    Why not to have all-purpose resize?

    Victor.
    Victor Shepelev, Mar 28, 2006
    #1
    1. Advertising

  2. Victor Shepelev a =E9crit :
    > Maybe dumb question, but...
    >
    > I have not found anything like Array.resize, i.e.
    >
    > a =3D [1,2]
    >
    > a.resize(5) #=3D> [1,2,nil,nil,nil] a.resize(5, 3) #=3D> [1,2,3,3=

    ,3]
    >
    >
    > I can use Array.fill, but
    >
    > a.fill(3, a.size, a.size+2)
    >
    > looks a bit ugly, not?
    >
    > Moreover, if I want to resize to size lesser then array is, I need
    > slice.
    >
    > Why not to have all-purpose resize?
    >
    > Victor.
    >

    You may try :

    a =3D [1,2]
    a.fill(3, -1, 3) #=3D> [1,2,3,3,3]

    So you may code yourself your resize :

    class Array
    def resize(new_size, value=3Dnil)
    if new_size < length
    slice!(new_size, length)
    else
    fill(value, -1, new_size-length)
    end
    self
    end
    end

    Pierre
    Pierre Barbier de Reuille, Mar 28, 2006
    #2
    1. Advertising

  3. Victor Shepelev wrote:
    > Maybe dumb question, but...
    >
    > I have not found anything like Array.resize, i.e.
    >
    > a = [1,2]
    >
    > a.resize(5) #=> [1,2,nil,nil,nil]
    > a.resize(5, 3) #=> [1,2,3,3,3]
    >
    > I can use Array.fill, but
    >
    > a.fill(3, a.size, a.size+2)
    >
    > looks a bit ugly, not?
    >


    a = [1,2,3]
    a += [nil] * 3

    > Moreover, if I want to resize to size lesser then array is, I need slice.
    >


    a = [1,2,3,4,5]
    a[0..-3]

    Ruby 1.9 supports Array#pop taking an integer

    lopex
    Marcin Mielżyński, Mar 28, 2006
    #3
  4. Pierre Barbier de Reuille wrote:

    >
    > a = [1,2]
    > a.fill(3, -1, 3) #=> [1,2,3,3,3]
    >


    nope:

    a = [1,2]
    a.fill(3, -1, 3) #=> [1,3,3,3]


    since -1 points to the last value in an array


    lopex
    Marcin Mielżyński, Mar 28, 2006
    #4
  5. Pierre wrote

    > So you may code yourself your resize :
    >
    > class Array
    > def resize(new_size, value=nil)
    > if new_size < length
    > slice!(new_size, length)
    > else
    > fill(value, -1, new_size-length)
    > end
    > self
    > end
    > end


    Yes, I can (in fact, I already did).

    The question is more ideological than technical. Why not to have
    Array#resize in standard library? It seems not very rational.

    > Pierre


    Victor.
    Victor Shepelev, Mar 28, 2006
    #5
  6. Victor Shepelev

    Guest

    Hi --

    On Tue, 28 Mar 2006, Victor Shepelev wrote:

    > Pierre wrote
    >
    >> So you may code yourself your resize :
    >>
    >> class Array
    >> def resize(new_size, value=nil)
    >> if new_size < length
    >> slice!(new_size, length)
    >> else
    >> fill(value, -1, new_size-length)
    >> end
    >> self
    >> end
    >> end

    >
    > Yes, I can (in fact, I already did).
    >
    > The question is more ideological than technical. Why not to have
    > Array#resize in standard library? It seems not very rational.


    I think it might be because the size of an array isn't important if
    the array just contains nils, because uninitialized values default to
    nil anyway. And if you're adding non-nil elements to the array, then
    the fact that the size changes is not really the main point; it's just
    a side-effect of the operation, so referring to it as a "resize"
    operation doesn't fit very well.


    David

    --
    David A. Black ()
    Ruby Power and Light, LLC (http://www.rubypowerandlight.com)

    "Ruby for Rails" chapters now available
    from Manning Early Access Program! http://www.manning.com/books/black
    , Mar 28, 2006
    #6
  7. David wrote:

    > > The question is more ideological than technical. Why not to have
    > > Array#resize in standard library? It seems not very rational.

    >
    > I think it might be because the size of an array isn't important if
    > the array just contains nils, because uninitialized values default to
    > nil anyway. And if you're adding non-nil elements to the array, then
    > the fact that the size changes is not really the main point; it's just
    > a side-effect of the operation, so referring to it as a "resize"
    > operation doesn't fit very well.


    Sounds reasonable.
    I can tell when I stumbled upon need for __resizing__ aray: when tried to
    use Array#transpose - it can't process
    [
    [1,2,3],
    [1],
    [1,2,3,4]
    ]

    I think, it isn't sole case, when we can want having array of arbitrary
    size.

    > David


    Victor.
    Victor Shepelev, Mar 28, 2006
    #7
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Ruan
    Replies:
    10
    Views:
    718
    Gabriel Genellina
    Feb 5, 2007
  2. someone else

    resizing an array, is there a better way?

    someone else, Aug 1, 2004, in forum: C Programming
    Replies:
    29
    Views:
    704
    Malcolm
    Aug 9, 2004
  3. Mara Guida

    const and array of array (of array ...)

    Mara Guida, Sep 2, 2009, in forum: C Programming
    Replies:
    3
    Views:
    471
    David RF
    Sep 3, 2009
  4. Pil (Trustworthy from Experience)

    Resizing a div by resizing its borders

    Pil (Trustworthy from Experience), Apr 18, 2009, in forum: Javascript
    Replies:
    9
    Views:
    336
    Proper
    Apr 21, 2009
  5. Proper
    Replies:
    0
    Views:
    189
    Proper
    Apr 18, 2009
Loading...

Share This Page