Hi –
On 4/29/07, Billy H. [email protected] wrote:
Thanks for your reply, I learned more on this thread
But I have a question:
If I have an array contain:
ary = [1, 12, 234, “456”]
there has two elements which size is 3, but the longest method just returned
one of them.
I can’t solve it
It depends how you want to break the tie. Here’s a way to do it where
a size tie is broken by string comparison, which is ASCII-based. The
nonzero? method will return -1 or 1 if the two string sizes are not
equal. If they are equal, the comparison will evaluate to zero and
nonzero? will be false – which means the second comparison (the ASCII
one) will be executed.
I’ve included some tests too.
class Array
def longest
sort do |a,b|
(a.to_s.size <=> b.to_s.size).nonzero? ||
a.to_s <=> b.to_s
end[-1]
end
end
require ‘test/unit’
class MaxTest < Test::Unit::TestCase
def test_all_strings
assert_equal(“David”, %w{ Da David Dav }.longest)
end
def test_all_numbers
assert_equal(34567, [123,12345,200,34567].longest)
end
def test_tie
assert_equal(“David”, %w{ David Alan Black }.longest)
end
def test_mixed
assert_equal(“David”, [123, “David”, 456].longest)
end
def test_mixed_tie
assert_equal(“David”, [12345, “David”, “Black”, 123, 98765].longest)
end
end
David