Extracting the shortest string from an array

Hi, given the following array:

array = [“qwe”, “qwerty”]

How to get the shortest element (“qwe”) from the array?
I whink I must inspect all the elements within the array and manually
select the shortest string, do I miss some cool feature of Array class
or Enumerable module?

Thanks a lot.

array.min{|a,b| a.size <=> b.size }

Hi,

in Ruby 1.9 this should work:

arr.sort_by(&:length)[0]

or more portable/readable (1.8 compatible):

arr.sort_by{|s| s.length }[0]

Am 03.03.2011 15:47, schrieb Iñaki Baz C.:

2011/3/3 Paul McKibbin [email protected]:

Hi,

You could use

array.min {|x,y| x.size <=> y.size}

to force a min to use sizes rather then their natural order

Thanks to all :slight_smile:

Hi,

You could use

array.min {|x,y| x.size <=> y.size}

to force a min to use sizes rather then their natural order

Mac

On 3/3/2011 09:01, Adam Hegge wrote:

array.min{|a,b| a.size <=> b.size }

You can actually simplify this even more. Take a look at
Enumerable#min_by:

http://rdoc.info/stdlib/core/1.8.7/Enumerable:min_by

-Jeremy

Very true

array.min_by{|a| a.size} would also do the trick.

Paul

On 03.03.2011 16:02, Thorsten H. wrote:

in Ruby 1.9 this should work:

arr.sort_by(&:length)[0]

Inefficient as it creates a new array. Better do

irb(main):001:0> [“qwe”, “qwerty”].min_by(&:length)
=> “qwe”

or more portable/readable (1.8 compatible):

arr.sort_by{|s| s.length }[0]

Inefficient as well (see above).

Cheers

robert

On Thu, Mar 3, 2011 at 7:18 PM, Josh C. [email protected] wrote:

Inefficient as it creates a new array. Better do
Inefficient as well (see above).
They’re also O( n lg n ) where the correct solution, using min, is O(n)

How do you know that it’s O(n * log n)? A reasonable implementation
of min_by would look like this:

def min_by(enum, &c)
min = nil
val = nil

enum.each do |e|
e_val = c[e]

if val.nil? || e_val < val
  min = e
  val = e_val
end

end

min
end

As far as I can see this is O(n).

Also, big O isn’t everything. Usually object allocation is very
expensive (compared to other operations) because of the GC
housekeeping overhead.

Cheers

robert

On Fri, Mar 4, 2011 at 4:11 AM, Robert K.
[email protected]wrote:

end

As far as I can see this is O(n).

Right. This was my point: using min is O(n), using sort is O(n lg n)

Also, big O isn’t everything. Usually object allocation is very
expensive (compared to other operations) because of the GC
housekeeping overhead.

I don’t contest this. I was pointing out that in addition to creating
more
objects, as you previously mentioned, using sort also has a worse time
complexity.

On Fri, Mar 4, 2011 at 11:36 AM, Josh C. [email protected]
wrote:

arr.sort_by(&:length)[0]
arr.sort_by{|s| s.length }[0]

Inefficient as well (see above).

They’re also O( n lg n ) where the correct solution, using min, is O(n)

Right. This was my point: using min is O(n), using sort is O(n lg n)

OK, now I get what you mean. You were referring to the sorts. That
wasn’t clear to me.

Also, big O isn’t everything. Usually object allocation is very
expensive (compared to other operations) because of the GC
housekeeping overhead.

I don’t contest this. I was pointing out that in addition to creating more
objects, as you previously mentioned, using sort also has a worse time
complexity.

Yep, sorry for the noise.

Cheers

robert

On Thu, Mar 3, 2011 at 11:35 AM, Robert K.
[email protected]wrote:

=> “qwe”

   robert


remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

They’re also O( n lg n ) where the correct solution, using min, is O(n)