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
>
> 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
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
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
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
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
> 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 ;-)
> 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
Certainly nothing,
but i would like to add my own version:
input.each{|i| result << i}
result = result.transpose
cheers
Simon