Array.new question

P

Peter Szinek

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
 
A

Alex Young

Peter said:
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]]
 
P

Peter Szinek

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
 
A

Alex Young

Peter said:
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.
 
R

Ross Bamford

Peter said:
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], [], [], []]
 
E

eden li

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
 
P

Peter Szinek

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
 
S

Simon Kröger

Peter said:
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
 

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

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,065
Latest member
OrderGreenAcreCBD

Latest Threads

Top