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
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)