Forum: Ruby Sorting help

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.
F107dd86fa9fd574c1bf999c29dc09b5?d=identicon&s=25 Binh Ly (binkly)
on 2008-10-13 01:27
Hello All,

I would like to request some helping with a sorting problem I have.

Given an array with values like this ["10.1", "7.4", "10.9", "10.11",
"10.10"]

when I sort it i get something like ["10.1", "10.10", "10.11", "10.9",
"7.4"]

What is the best way to sort such an array of strings?

What if the string was extended to "10.1.25".

Any advice would be greatly appreciated.

Thank you.

Binh
79880c706cbf9ae03dfe330f551d46dd?d=identicon&s=25 Ron Askew (Guest)
on 2008-10-13 01:52
(Received via mailing list)
I the values are actually numeric, they should be stored as numerics,
manipulated as numerics, and sorted as numerics.

So... the question is: WHY ARE THEY STRINGS?
A61ecce13ed142622f24a5ca3a123922?d=identicon&s=25 Matthew Moss (Guest)
on 2008-10-13 01:55
(Received via mailing list)
> What if the string was extended to "10.1.25".
I might do something like this:


arr.sort_by { |str| str.split('.').map { |x| x.to_i } }
7a561ec0875fcbbe3066ea8fe288ec77?d=identicon&s=25 Sebastian Hungerecker (Guest)
on 2008-10-13 01:57
(Received via mailing list)
Ron Askew wrote:
> I the values are actually numeric, they should be stored as numerics,
> manipulated as numerics, and sorted as numerics.
>
> So... the question is: WHY ARE THEY STRINGS?

PROBABLY BECAUSE THE OP REALIZED THAT 10.1.25 ISN'T REALLY A LEGAL
NUMBER.
And he either did not think of storing it as [10,1,25] or maybe he reads
it
from user input or from a file. Though of course the solution (to get
numerical sorting) still is to get it into that form
(split(".").map(&:to_i))
and then sort.

HTH,
Sebastian
7a561ec0875fcbbe3066ea8fe288ec77?d=identicon&s=25 Sebastian Hungerecker (Guest)
on 2008-10-13 02:00
(Received via mailing list)
Binh Ly wrote:
> What is the best way to sort such an array of strings?

Having already given one (hopefully) helpful answer, I can't help that
the way
you phrased your question (or more precisely the way you didn't specify
what
you actually wanted), I was a little tempted to answer:
*That* is the best way to sort an array of strings.
Ee04bc0ca6dcdad4a7e8a8e1d4efb5d0?d=identicon&s=25 Michael W. Ryder (Guest)
on 2008-10-13 02:05
(Received via mailing list)
Ron Askew wrote:
> I the values are actually numeric, they should be stored as numerics,
> manipulated as numerics, and sorted as numerics.
>
> So... the question is: WHY ARE THEY STRINGS?
>

The data may be coming from another source that the OP has no control
over.  In the language I do most of my programming in, Business Basic,
everything is stored as a string, so 12.35 is stored as "12.25" instead
of it's binary representation.
When I have this problem in Business Basic what I do is add leading
zeros before storing the numbers in a file.  The file system in Business
Basic allows me to store records in a file and automatically sorts them
by the key value.  This means that you have to know in advance the size
of the numbers.
What I would do is store the strings as ["10.1", "07.4", "10.9",
"10.11", "10.10"] and this should sort properly.  In the second case I
would store the number as "10.01.25".  Now if the numbers are something
like TCP addresses this method probably won't work.
6087a044557d6b59ab52e7dd20f94da8?d=identicon&s=25 Peña, Botp (Guest)
on 2008-10-13 05:47
(Received via mailing list)
From: Binh Ly [mailto:binh@pigbaby.net]
# Given an array with values like this ["10.1", "7.4", "10.9", "10.11",
# "10.10"]
# when I sort it i get something like ["10.1", "10.10", "10.11", "10.9",
"7.4"]
# What is the best way to sort such an array of strings?
# What if the string was extended to "10.1.25".

others have shown split+map

you can also do it w the humble scanf (yes, like c's scanf)

eg,

a.sort_by{|x| x.scanf "%d.%d"}
#=> ["7.4", "10.1", "10.9", "10.10", "10.11"]
E0d864d9677f3c1482a20152b7cac0e2?d=identicon&s=25 Robert Klemme (Guest)
on 2008-10-13 14:23
(Received via mailing list)
2008/10/13 Binh Ly <binh@pigbaby.net>:
> What is the best way to sort such an array of strings?
>
> What if the string was extended to "10.1.25".
>
> Any advice would be greatly appreciated.

My advice so far would be to state what order you want to achieve.
You just say what the output of a plain string sort is but not what
you want it to be.

Cheers

robert
6b0967f63d03e99b6c07a3f5ed224c77?d=identicon&s=25 Erik Veenstra (Guest)
on 2008-10-13 14:55
(Received via mailing list)
What about this one?:

 module Enumerable
   def sort_number_word_other
     sort_by do |x|
       x.to_s.scan(/\d+|\w+|[^\d\w]+/).collect do |s|
         [s.to_i, s]
       end
     end
   end
 end

It handles comparisons of strings like "ruby-1.8.7.tar.gz" pretty
well. It even knows how to sort [3, "2.1"] in "a way".

> What is the best way to sort such an array of strings?

"best way"? Depends on the problem domain. There's no generic answer.

gegroet,
Erik V.
73ba5e17cf39ee5aa4ada6eefdb80177?d=identicon&s=25 Joe Wölfel (Guest)
on 2008-10-13 18:24
(Received via mailing list)
Hi All,

I'm looking for a Ruby audio API.   Is there a good one already
available or is anyone in the process of working on one?   I'd like
one that is easy to install and manage, such as a gem with no or
automatic dependencies.  Also, I'd like a liberal license, at least
as liberal as LGPL or better yet BSD because I'd like to eventually
give away the tools I'm working on with the fewest possible
restrictions.

If I can't find one I'm considering writing one using something like
PortAudio.   Would that make sense?  If I were to do that does anyone
have any suggestions for how it should be done to make it work best
with Ruby?
E0d864d9677f3c1482a20152b7cac0e2?d=identicon&s=25 Robert Klemme (Guest)
on 2008-10-13 19:35
(Received via mailing list)
On 13.10.2008 18:20, Joe Wölfel wrote:
> I'm looking for a Ruby audio API.

Please do not hijack other threads.  This is a completely different
topic which deserves its own thread.  Thank you!

Kind regards

  robert
9d4960f8319664f0f7896230eebace73?d=identicon&s=25 Glen Holcomb (Guest)
on 2008-10-13 19:53
(Received via mailing list)
On Mon, Oct 13, 2008 at 11:32 AM, Robert Klemme
<shortcutter@googlemail.com>wrote:

>        robert
>
>
Maybe it's just me but I don't see any other conversation here but the
audio
question.

Joe,

I haven't used anything like what you are describing but there are some
Ruby
Audio libraries:

http://hans.fugal.net/src/ruby-audio/doc/
http://raa.ruby-lang.org/cat.rhtml?category_major=...

-Glen

--
"Hey brother Christian with your high and mighty errand, Your actions
speak
so loud, I can't hear a word you're saying."

-Greg Graffin (Bad Religion)
73ba5e17cf39ee5aa4ada6eefdb80177?d=identicon&s=25 Joe Wölfel (Guest)
on 2008-10-13 20:06
(Received via mailing list)
My apologies.

How exactly did I hijack another thread?  Please let me know so I can
avoid doing it in the future.
E0d864d9677f3c1482a20152b7cac0e2?d=identicon&s=25 Robert Klemme (Guest)
on 2008-10-13 20:51
(Received via mailing list)
On 13.10.2008 20:03, Joe Wölfel wrote:
> My apologies.

Accepted.

> How exactly did I hijack another thread?  Please let me know so I can
> avoid doing it in the future.

I do not know how you did it, but in c.l.r (Usenet newsgroup) your topic
references "Sorting Help".  Maybe you just replied to a message on that
thread.

Cheers

  robert
31e038e4e9330f6c75ccfd1fca8010ee?d=identicon&s=25 Gregory Brown (Guest)
on 2008-10-13 21:00
(Received via mailing list)
On Mon, Oct 13, 2008 at 2:47 PM, Robert Klemme
<shortcutter@googlemail.com> wrote:
> references "Sorting Help".  Maybe you just replied to a message on that
> thread.

Right, if you reply to a message and replace its subject, the
threading is still preserved from the original message.  My guess is
the OP did that by accident, and the problem can be solved by starting
a new message rather than using reply and changing the subject.

It is only a good idea to change the subject within a thread to show a
topic that has diverged from the original but is still of the same
originating conversation.  New conversations deserve new toplevel
threads.

-greg
E0d864d9677f3c1482a20152b7cac0e2?d=identicon&s=25 Robert Klemme (Guest)
on 2008-10-13 21:02
(Received via mailing list)
On 13.10.2008 19:50, Glen Holcomb wrote:
> Maybe it's just me but I don't see any other conversation here but the audio
> question.

Where is "here"?  I am looking at Usenet at the moment.

Cheers

  robert
73ba5e17cf39ee5aa4ada6eefdb80177?d=identicon&s=25 Joe Wölfel (Guest)
on 2008-10-13 21:07
(Received via mailing list)
On 13 oct. 08, at 14:56, Gregory Brown wrote:

>>>  avoid doing it in the future.
> a new message rather than using reply and changing the subject.
>
> It is only a good idea to change the subject within a thread to show a
> topic that has diverged from the original but is still of the same
> originating conversation.  New conversations deserve new toplevel
> threads.
>
> -greg

Possible.   I can't remember what exactly I was doing.  I'll repost
in a fresh window.  Again, I didn't mean to cause any trouble.
9d4960f8319664f0f7896230eebace73?d=identicon&s=25 Glen Holcomb (Guest)
on 2008-10-13 21:36
(Received via mailing list)
On Mon, Oct 13, 2008 at 12:57 PM, Robert Klemme
<shortcutter@googlemail.com>wrote:

>>> topic
>
>        robert
>
>
>
I was reading in my email, It had shown as a new topic in gmail.

--
"Hey brother Christian with your high and mighty errand, Your actions
speak
so loud, I can't hear a word you're saying."

-Greg Graffin (Bad Religion)
E0d864d9677f3c1482a20152b7cac0e2?d=identicon&s=25 Robert Klemme (Guest)
on 2008-10-14 09:05
(Received via mailing list)
2008/10/13 Glen Holcomb <damnbigman@gmail.com>:
> On Mon, Oct 13, 2008 at 12:57 PM, Robert Klemme
> <shortcutter@googlemail.com>wrote:
>
>> On 13.10.2008 19:50, Glen Holcomb wrote:

>>>>  Maybe it's just me but I don't see any other conversation here but the
>>> audio
>>> question.

>> Where is "here"?  I am looking at Usenet at the moment.

> I was reading in my email, It had shown as a new topic in gmail.

Ah, this might be an explanation: I believe GMail's web frontend does
not consider mails with different subjects to be in the same thread.
That would explain, why you did not see this.

Cheers

robert
This topic is locked and can not be replied to.