Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > What's the ruby way to sort string with cases in mind

Reply
Thread Tools

What's the ruby way to sort string with cases in mind

 
 
Sam Kong
Guest
Posts: n/a
 
      09-19-2006
Hi,

I'd like to sort an array of strings case-insensitively.
However, if 2 strings are case-insensitively same, I want capital
letters to come first.

a = %w(a c b A C B)
a.sort_by { |i| i.upcase } # => ["a", "A", "b", "B", "c", "C"]

Actually, I want ["A", "a", "B", "b", "C", "c"] .
I can get the result with the following trick.

a.sort_by {|i| i.upcase + i}

But I think there's a more rubyish way.
How do you do that?

Thanks in advance.

Sam

 
Reply With Quote
 
 
 
 
Devin Mullins
Guest
Posts: n/a
 
      09-20-2006
Sam Kong wrote:
> I'd like to sort an array of strings case-insensitively.

Alternate method (slightly "faster", maybe):
a = %w(a c b A C B)
a.sort {|a,b| a.casecmp b} #=> ["a", "A", "b", "B", "c", "C"]

> Actually, I want ["A", "a", "B", "b", "C", "c"] .
> I can get the result with the following trick.
>
> a.sort_by {|i| i.upcase + i}

Clever.

> But I think there's a more rubyish way.
> How do you do that?

No clue. Maybe implement your own comparator? {|a,b| dict_order(a,b)}?

Devin

 
Reply With Quote
 
 
 
 
MonkeeSage
Guest
Posts: n/a
 
      09-20-2006
Sam Kong wrote:
> But I think there's a more rubyish way.
> How do you do that?


Hi Sam,

I think that's probably the most concise and rubyish way. You can't do
a (simple) sort by ascii ordinal (i[0] in 1.8, or i.ord in 1.9), as
that would give you all the capitals first. And implementing your own
sort routine is not going to be anywhere near as clean as what you've
got. So yeah, imo, go with what you have, it's nice.

Regards,
Jordan

 
Reply With Quote
 
Rimantas Liubertas
Guest
Posts: n/a
 
      09-20-2006
> And implementing your own
> sort routine is not going to be anywhere near as clean as what you've
> got.


My best try so far is like that:

a.sort{ |i,j| (i.upcase == j.upcase)? (i<=>j)i.upcase<=>j.upcase) }

Not elegant, but not too ugly (or is it?). I've got a feeling there
must be a way to simplify this.


Regards,
Rimantas
--
http://rimantas.com/

 
Reply With Quote
 
Robert Klemme
Guest
Posts: n/a
 
      09-20-2006
On 20.09.2006 09:19, Rimantas Liubertas wrote:
>> And implementing your own
>> sort routine is not going to be anywhere near as clean as what you've
>> got.

>
> My best try so far is like that:
>
> a.sort{ |i,j| (i.upcase == j.upcase)? (i<=>j)i.upcase<=>j.upcase) }
>
> Not elegant, but not too ugly (or is it?). I've got a feeling there
> must be a way to simplify this.


a.sort {|i,j| i.upcase == j.upcase ? i <=> j : i.upcase <=> j.upcase}


Maybe a bit more efficient:

a.sort do |i,j|
cmp = i.downcase <=> j.downcase
cmp == 0 ? i <=> j : cmp
end

Cheers

robert
 
Reply With Quote
 
MonkeeSage
Guest
Posts: n/a
 
      09-20-2006
I shouldn't have underestimated my fellow rubyists. I guess
implementing your own sort routine _can_ be *near* as clean.

Regards,
Jordan

 
Reply With Quote
 
WATANABE Hirofumi
Guest
Posts: n/a
 
      09-20-2006
Hi,

"Rimantas Liubertas" <(E-Mail Removed)> writes:

>
> > And implementing your own
> > sort routine is not going to be anywhere near as clean as what you've
> > got.

>
> My best try so far is like that:
>
> a.sort{ |i,j| (i.upcase == j.upcase)? (i<=>j)i.upcase<=>j.upcase) }
>
> Not elegant, but not too ugly (or is it?). I've got a feeling there
> must be a way to simplify this.


a.sort{ |i,j| [i.upcase, i] <=> [j.upcase, j] }

a.sort_by{ |i| [i.upcase, i] }

--
eban

 
Reply With Quote
 
Rimantas Liubertas
Guest
Posts: n/a
 
      09-20-2006
>
> a.sort{ |i,j| [i.upcase, i] <=> [j.upcase, j] }
>
> a.sort_by{ |i| [i.upcase, i] }


Great! I guess we have the winner


Regards,
Rimantas
--
http://rimantas.com/

 
Reply With Quote
 
MonkeeSage
Guest
Posts: n/a
 
      09-20-2006
Nice one, Hirofumi-shi!

Regards,
Jordan

 
Reply With Quote
 
Robert Klemme
Guest
Posts: n/a
 
      09-20-2006
On 20.09.2006 10:56, Rimantas Liubertas wrote:
>>
>> a.sort{ |i,j| [i.upcase, i] <=> [j.upcase, j] }
>>
>> a.sort_by{ |i| [i.upcase, i] }

>
> Great! I guess we have the winner


+1

robert
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: unittest - sort cases to be run Terry Reedy Python 2 08-21-2012 05:27 PM
Connecting multiple test cases in a sort of pipe Raghuram Devarakonda Python 2 07-30-2009 02:59 PM
sort function, in non-standard cases alexxx.magni@gmail.com Perl Misc 11 06-26-2007 09:03 PM
Home server cases and external firewire cases thingy@nowhere.commy NZ Computing 5 03-14-2006 07:56 AM
Ado sort error-Ado Sort -Relate, Compute By, or Sort operations cannot be done on column(s) whose key length is unknown or exceeds 10 KB. Navin ASP General 1 09-09-2003 07:16 AM



Advertisments