[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Array.new question

Peter Szinek

10/17/2006 8:59:00 AM

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


8 Answers

Alex Young

10/17/2006 9:08:00 AM

0

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

10/17/2006 9:21:00 AM

0

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









Alex Young

10/17/2006 9:45:00 AM

0

Peter Szinek wrote:
>> 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 ;)
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

10/17/2006 9:49:00 AM

0

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 - rosco@roscopeco.REMOVE.co.uk


eden li

10/17/2006 9:52:00 AM

0

> 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

10/17/2006 9:52:00 AM

0

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





Peter Szinek

10/17/2006 10:16:00 AM

0

Robert Dober wrote:
> On 10/17/06, Peter Szinek <peter@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.rubyra...


Simon Kröger

10/17/2006 10:39:00 AM

0

Peter Szinek schrieb:
> Robert Dober wrote:
>> On 10/17/06, Peter Szinek <peter@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