Looking for more Ruby-like way to create an array

  • Thread starter Steve Nicholson
  • Start date
S

Steve Nicholson

I'm creating an array that is the result of the members of another array
each multiplied by 100. Here's what I have:

converted_array = []
original_array.each {|line| converted_array << line.to_f * 100}

This works, but I'm wondering if there is a more idiomatically "Ruby"
way of doing it.
 
T

Tim Hunter

Steve said:
I'm creating an array that is the result of the members of another array
each multiplied by 100. Here's what I have:

converted_array = []
original_array.each {|line| converted_array << line.to_f * 100}

This works, but I'm wondering if there is a more idiomatically "Ruby"
way of doing it.

Try map

converted_array = orginal_array.map {|line| line.to_f * 100 }
 
R

Rimantas Liubertas

2008/10/8 Steve Nicholson said:
I'm creating an array that is the result of the members of another array
each multiplied by 100. Here's what I have:

converted_array = []
original_array.each {|line| converted_array << line.to_f * 100}

This works, but I'm wondering if there is a more idiomatically "Ruby"
way of doing it.

converted_array = original_array.map{|item| item.to_f * 100}

Regards,
Rimantas
 
S

Steve Nicholson

Tim said:
Try map

converted_array = orginal_array.map {|line| line.to_f * 100 }

Thanks, Tim, Rimantas, and Dan for the unanimous advice. I will study up
on map.
 
W

William James

I'm creating an array that is the result of the members of another array
each multiplied by 100. Here's what I have:

  converted_array = []
  original_array.each {|line| converted_array << line.to_f * 100}

This works, but I'm wondering if there is a more idiomatically "Ruby"
way of doing it.

irb(main):001:0> a = 2,3,5,8
=> [2, 3, 5, 8]
irb(main):002:0> a.map!{|n| n*10 }
=> [20, 30, 50, 80]
irb(main):003:0> a
=> [20, 30, 50, 80]
 
B

Bilyk, Alex

converted_array =3D original_array.inject([]) {|a, line| a << (line.to_f * =
100)}

-----Original Message-----
From: David A. Black [mailto:[email protected]]
Sent: Tuesday, October 07, 2008 6:19 PM
To: ruby-talk ML
Subject: Re: Looking for more Ruby-like way to create an array

Hi --

I'm creating an array that is the result of the members of another
array each multiplied by 100. Here's what I have:

converted_array =3D []
original_array.each {|line| converted_array << line.to_f * 100}

This works, but I'm wondering if there is a more idiomatically "Ruby"
way of doing it.

irb(main):001:0> a =3D 2,3,5,8
=3D> [2, 3, 5, 8]
irb(main):002:0> a.map!{|n| n*10 }
=3D> [20, 30, 50, 80]
irb(main):003:0> a
=3D> [20, 30, 50, 80]

That's a little different, since it leaves you without the original array (=
which may in fact be OK, but is an important difference).


David

--
Rails training from David A. Black and Ruby Power and Light:
Intro to Ruby on Rails January 12-15 Fort Lauderdale, FL
Advancing with Rails January 19-22 Fort Lauderdale, FL *
* Co-taught with Patrick Ewing!
See http://www.rubypal.com for details and updates!
 
D

David A. Black

Hi --

converted_array = original_array.inject([]) {|a, line| a << (line.to_f * 100)}

I'd definitely favor map over inject for this. It's much more
straightforward for this particular operation.


David

--
Rails training from David A. Black and Ruby Power and Light:
Intro to Ruby on Rails January 12-15 Fort Lauderdale, FL
Advancing with Rails January 19-22 Fort Lauderdale, FL *
* Co-taught with Patrick Ewing!
See http://www.rubypal.com for details and updates!
 
J

Joshua Abbott

I agree with David. I did a simple benchmarking test and you can already
see a difference with an array of ten integers:

irb(main):001:0> require 'benchmark'
=> true
irb(main):002:0> a = [1,2,3,4,5,6,7,8,9,10]
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
irb(main):003:0> Benchmark.bm do |b|
irb(main):004:1* b.report { new_array = a.inject([]) { |array,item|
array << item * 100 } }
irb(main):005:1> end
user system total real
0.000000 0.000000 0.000000 ( 0.000035)
=> true
irb(main):006:0> Benchmark.bm do |b|
irb(main):007:1* b.report { new_array = a.map { |item| item * 100 }
}
irb(main):008:1> end
user system total real
0.000000 0.000000 0.000000 ( 0.000022)
=> true
irb(main):009:0>

But if you up the ante (because how often is it that we deal with an
array of only ten elements?) you get something more like this:

irb(main):009:0> a = (0..250).map
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72,
73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,
149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162,
163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176,
177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190,
191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204,
205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218,
219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232,
233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246,
247, 248, 249, 250]
irb(main):010:0> Benchmark.bm do |b|
irb(main):011:1* b.report { new_array = a.inject([]) { |array,item|
array << item * 100 } }
irb(main):012:1> end
user system total real
0.000000 0.000000 0.000000 ( 0.000442)
=> true
irb(main):013:0> Benchmark.bm do |b|
irb(main):014:1* b.report { new_array = a.map { |item| item * 100 }
}
irb(main):015:1> end
user system total real
0.000000 0.000000 0.000000 ( 0.000165)
=> true
irb(main):016:0>

So you can see there's some substantial difference with map. Not to
mention, "map" just looks cleaner and creates an array by default (where
inject can do many different things).

You can get more background on why inject takes longer than map by
reading the documentation:

Map: http://ruby-doc.org/core/classes/Array.html#M002212
Inject: http://ruby-doc.org/core/classes/Enumerable.html#M003160

-- Josh
http://iammrjoshua.com
Hi --

converted_array = original_array.inject([]) {|a, line| a << (line.to_f * 100)}

I'd definitely favor map over inject for this. It's much more
straightforward for this particular operation.


David
 
R

Robert Klemme

2008/10/8 David A. Black said:
converted_array = original_array.inject([]) {|a, line| a << (line.to_f *
100)}

I'd definitely favor map over inject for this. It's much more
straightforward for this particular operation.

Absolutely agree!

robert
 

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
474,199
Messages
2,571,045
Members
47,643
Latest member
ashutoshjha_1101

Latest Threads

Top