Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Array.new question

0 views
Skip to first unread message

Peter Szinek

unread,
Oct 17, 2006, 4:59:06 AM10/17/06
to
Hello,

1)
I would like to create an array of n empty arrays, i.e.

[ [], [], ... n-3 []'s, [] ]

So that the inner arrays are different objects.

Array.new(n,[]) does not help since the created arrays are not different
objects.

Is there an idiomatic way to accomplish this?

2) Is there an idiomatic way to do this (in a generic way, of course):

some_func(
[1,2,3]
[4,5,6]
[7,8,9] )

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

Thanks,
Peter
http://www.rubyrailways.com


Alex Young

unread,
Oct 17, 2006, 5:08:08 AM10/17/06
to
Peter Szinek wrote:
> Hello,
>
> 1)
> I would like to create an array of n empty arrays, i.e.
>
> [ [], [], ... n-3 []'s, [] ]
>
> So that the inner arrays are different objects.
>
> Array.new(n,[]) does not help since the created arrays are not different
> objects.
>
> Is there an idiomatic way to accomplish this?
a = (0..3).collect{[]} # => [[], [], [], []]
a[0][0] = 1
a # => [[1], [], [], []]

>
> 2) Is there an idiomatic way to do this (in a generic way, of course):
>
> some_func(
> [1,2,3]
> [4,5,6]
> [7,8,9] )
>
> => [ [1,4,7], [2,5,8], [3,6,9] ]

[1,2,3].zip([4,5,6],[7,8,9]) # => [[1,4,7], [2,5,8], [3,6,9]]

--
Alex

Peter Szinek

unread,
Oct 17, 2006, 5:20:45 AM10/17/06
to
> a = (0..3).collect{[]} # => [[], [], [], []]
> a[0][0] = 1
> a # => [[1], [], [], []]

Thx!

>> 2) Is there an idiomatic way to do this (in a generic way, of course):
>>
>> some_func(
>> [1,2,3]
>> [4,5,6]
>> [7,8,9] )
>>
>> => [ [1,4,7], [2,5,8], [3,6,9] ]
> [1,2,3].zip([4,5,6],[7,8,9]) # => [[1,4,7], [2,5,8], [3,6,9]]

Sorry, I did not describe the scenario properly.
The thing is that I am iterating over an array (of arrays)
and I don't have the all the arrays at once (the inner arrays are
generated on the fly). Let me illustrate it:

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

input.each { |i| do_something_with(result, i) }

and the result should be

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

The question sounds: how is do_something_with implemented?
I have already implemented it but I don't think so it's a state-of-the
art solution ;)

Thanks,
Peter
http://www.rubyrailways.com

Alex Young

unread,
Oct 17, 2006, 5:45:23 AM10/17/06
to
Right... In that case, how about this:

input.each{|i| i.each_with_index{|x,j| (result[j] ||= []) << x}}

Not sure if it'll play the way you want with variable-length arrays, but
it puts the right contents in result.

--
Alex

Ross Bamford

unread,
Oct 17, 2006, 5:49:10 AM10/17/06
to
On Tue, 2006-10-17 at 18:08 +0900, Alex Young wrote:
> Peter Szinek wrote:
> > Hello,
> >
> > 1)
> > I would like to create an array of n empty arrays, i.e.
> >
> > [ [], [], ... n-3 []'s, [] ]
> >
> > So that the inner arrays are different objects.
> >
> > Array.new(n,[]) does not help since the created arrays are not different
> > objects.
> >
> > Is there an idiomatic way to accomplish this?
> a = (0..3).collect{[]} # => [[], [], [], []]
> a[0][0] = 1
> a # => [[1], [], [], []]

I think this will do the same thing, too:

a = Array.new(4) { [] }


# => [[], [], [], []]

a[0][0] = 1

# => 1

a
# => [[1], [], [], []]

--
Ross Bamford - ro...@roscopeco.REMOVE.co.uk


eden li

unread,
Oct 17, 2006, 5:51:30 AM10/17/06
to
> input = [ [1,2,3], [4,5,6], [7,8,9] ]
> result = []
>
> input.each { |i| do_something_with(result, i) }
>
> and the result should be
>
> [ [1,4,7], [2,5,8], [3,6,9] ]
>
> The question sounds: how is do_something_with implemented?
> I have already implemented it but I don't think so it's a state-of-the
> art solution ;)

Not so state-of-the-art but succint:

def do_something_with_result(a, i)
i.each_with_index { |e, j|
a[j] ? a[j] << e : a << [e]
}
end


Peter Szinek

unread,
Oct 17, 2006, 5:52:01 AM10/17/06
to
Alex,

> Right... In that case, how about this:
>
> input.each{|i| i.each_with_index{|x,j| (result[j] ||= []) << x}}
>
> Not sure if it'll play the way you want with variable-length arrays, but
> it puts the right contents in result.

Thx for the solution! Mine was totally the same (for the first time in
history since I am using Ruby :-) as someone proposed on this list ;-)

Peter
http://www.rubyrailways.com

Peter Szinek

unread,
Oct 17, 2006, 6:16:04 AM10/17/06
to
Robert Dober wrote:
> On 10/17/06, Peter Szinek <pe...@rubyrailways.com> wrote:

> You are simply brilliant ;)

I am certainly very far from that... I was just happy that (still being
a noob) I have solved something on my own for the first time. What's
wrong with that?

Peter
http://www.rubyrailways.com


Simon Kröger

unread,
Oct 17, 2006, 6:39:25 AM10/17/06
to
Peter Szinek schrieb:

> Robert Dober wrote:
>> On 10/17/06, Peter Szinek <pe...@rubyrailways.com> wrote:
>
>> You are simply brilliant ;)
>
> I am certainly very far from that... I was just happy that (still being
> a noob) I have solved something on my own for the first time. What's
> wrong with that?

Certainly nothing,

but i would like to add my own version:

input.each{|i| result << i}
result = result.transpose

cheers

Simon

0 new messages