Forum: Ruby Looking for more Ruby-like way to create an array

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
66bc542765c1079e1dfb89dcf3b5348c?d=identicon&s=25 Steve Nicholson (ssteve)
on 2008-10-07 23:35
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.
3afd3e5e05dc9310c89aa5762cc8dd1d?d=identicon&s=25 Tim Hunter (Guest)
on 2008-10-07 23:42
(Received via mailing list)
Steve Nicholson wrote:
> 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 }
Ec5a599777854c540fd102ef4691fe10?d=identicon&s=25 Rimantas Liubertas (Guest)
on 2008-10-07 23:45
(Received via mailing list)
2008/10/8 Steve Nicholson <ssteve@mac.com>:
> 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
Ad97b577f331ae29ed90da5751f2e44f?d=identicon&s=25 Dan Diebolt (dandiebolt)
on 2008-10-07 23:46
(Received via mailing list)
a=[1,2,3]
a.map (|item| 100*item}

--- On Tue, 10/7/08, Steve Nicholson <ssteve@mac.com> wrote:

From: Steve Nicholson <ssteve@mac.com>
Subject: Looking for more Ruby-like way to create an array
To: "ruby-talk ML" <ruby-talk@ruby-lang.org>
Date: Tuesday, October 7, 2008, 5:33 PM

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.
66bc542765c1079e1dfb89dcf3b5348c?d=identicon&s=25 Steve Nicholson (ssteve)
on 2008-10-07 23:50
Tim Hunter wrote:

> 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.
2ee1a7960cc761a6e92efb5000c0f2c9?d=identicon&s=25 William James (Guest)
on 2008-10-08 01:05
(Received via mailing list)
On Oct 7, 4:33 pm, Steve Nicholson <sst...@mac.com> wrote:
> 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.
> --
> Posted viahttp://www.ruby-forum.com/.

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]
F53b05cdbdf561cfe141f69b421244f3?d=identicon&s=25 David A. Black (Guest)
on 2008-10-08 03:21
(Received via mailing list)
Hi --

On Wed, 8 Oct 2008, William James wrote:

>> Posted viahttp://www.ruby-forum.com/.
>
> 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]

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
58d1114fe29aab2d433231a722dd2034?d=identicon&s=25 Bilyk, Alex (Guest)
on 2008-10-08 03:35
(Received via mailing list)
converted_array = original_array.inject([]) {|a, line| a << (line.to_f *
100)}
F53b05cdbdf561cfe141f69b421244f3?d=identicon&s=25 David A. Black (Guest)
on 2008-10-08 03:40
(Received via mailing list)
Hi --

On Wed, 8 Oct 2008, Bilyk, Alex wrote:

> 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
36aef9956c6082f69622dd67e8da376f?d=identicon&s=25 Joshua Abbott (joshnabbott)
on 2008-10-08 06:45
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

David A. Black wrote:
> Hi --
>
> On Wed, 8 Oct 2008, Bilyk, Alex wrote:
>
>> 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
E0d864d9677f3c1482a20152b7cac0e2?d=identicon&s=25 Robert Klemme (Guest)
on 2008-10-08 14:39
(Received via mailing list)
2008/10/8 David A. Black <dblack@rubypal.com>:
> On Wed, 8 Oct 2008, Bilyk, Alex wrote:
>
>> 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
This topic is locked and can not be replied to.