[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

how to sort a multi-elements array

Erwin

5/31/2008 5:32:00 PM

I know how to sort an array with 2 elements... that's the only example
I could fin on Array#sort...
but what if ... I need to sort an array like this one :

anArray = [ [1, "joe", 4], [2, "arthur", 2], [5, "william", 3], [16,
"bob", 1], [20, "ernesto", 17], [27, "julia", 1], [28, "barbara", 2] ]

sorting on third-element (highest ranking) , and second-element
(nickname)

aSortedArray = [ [20, "ernesto", 17], [1, "joe", 4], 5, "william", 3],
[2, "arthur", 2], [28, "barbara", 2], [16, "bob", 1] ]

any doc link where this is explained ?

thanks a lot for your tip
6 Answers

Robert Klemme

5/31/2008 5:41:00 PM

0

On 31.05.2008 19:31, Erwin wrote:
> I know how to sort an array with 2 elements... that's the only example
> I could fin on Array#sort...
> but what if ... I need to sort an array like this one :
>
> anArray = [ [1, "joe", 4], [2, "arthur", 2], [5, "william", 3], [16,
> "bob", 1], [20, "ernesto", 17], [27, "julia", 1], [28, "barbara", 2] ]
>
> sorting on third-element (highest ranking) , and second-element
> (nickname)
>
> aSortedArray = [ [20, "ernesto", 17], [1, "joe", 4], 5, "william", 3],
> [2, "arthur", 2], [28, "barbara", 2], [16, "bob", 1] ]
>
> any doc link where this is explained ?

As always, use #sort with a block or #sort_by - the number of elements
in those arrays is irrelevant, you just need to decide which elements
you want to pick as sort key.

an_array.sort_by {|a,b,c| [c,b]}
an_array.sort {|(a,b,c),(d,e,f)| [c,b] <=> [f,e]}
an_array.sort do |(a,b,c),(d,e,f)|
x = c <=> f
x == 0 ? b <=> e : x
end

Btw, your data looks like it could benefit from using Struct and also
benefit from the automatically implemented <=>, i.e.

Person = Struct.new :age, :name, :position

an_array = [
Person.new(4, "joe", 1),
Person.new(2, "arthur", 2),
Person.new(3, "william", 5),
]

Kind regards

robert

Stefano Crocco

5/31/2008 5:42:00 PM

0

On Saturday 31 May 2008, Erwin wrote:
> I know how to sort an array with 2 elements... that's the only example
> I could fin on Array#sort...
> but what if ... I need to sort an array like this one :
>
> anArray = [ [1, "joe", 4], [2, "arthur", 2], [5, "william", 3], [16,
> "bob", 1], [20, "ernesto", 17], [27, "julia", 1], [28, "barbara", 2] ]
>
> sorting on third-element (highest ranking) , and second-element
> (nickname)
>
> aSortedArray = [ [20, "ernesto", 17], [1, "joe", 4], 5, "william", 3],
> [2, "arthur", 2], [28, "barbara", 2], [16, "bob", 1] ]
>
> any doc link where this is explained ?
>
> thanks a lot for your tip

You can do this:

aSortedArray = anArray.sort do |a, b|
if a[2] == b[2] then a[1] <=> b[1]
else a[2] <=> b[2]
end
end

If the third element of the two subarrays are equal, then the block returns
the result of the comparison of the second elements (using <=>), otherwise it
returns the result of the comparison of the third elements, again using <=>.

I hope this helps

Stefano


Erwin

6/1/2008 6:31:00 AM

0

On 31 mai, 19:40, Robert Klemme <shortcut...@googlemail.com> wrote:
> On 31.05.2008 19:31, Erwin wrote:
>
> > I know how to sort an array with 2 elements... that's the only example
> > I could fin on Array#sort...
> > but what if ... I need to sort an array like this one :
>
> > anArray = [ [1, "joe", 4], [2, "arthur", 2], [5, "william", 3], [16,
> > "bob", 1], [20, "ernesto", 17], [27, "julia", 1], [28, "barbara", 2] ]
>
> > sorting on third-element (highest ranking) , and second-element
> > (nickname)
>
> > aSortedArray = [ [20, "ernesto", 17], [1, "joe", 4], 5, "william", 3],
> > [2, "arthur", 2], [28, "barbara", 2], [16, "bob", 1] ]
>
> > any doc link where this is explained ?
>
> As always, use #sort with a block or #sort_by - the number of elements
> in those arrays is irrelevant, you just need to decide which elements
> you want to pick as sort key.
>
> an_array.sort_by {|a,b,c| [c,b]}
> an_array.sort {|(a,b,c),(d,e,f)| [c,b] <=> [f,e]}
> an_array.sort do |(a,b,c),(d,e,f)|
> x = c <=> f
> x == 0 ? b <=> e : x
> end
>
> Btw, your data looks like it could benefit from using Struct and also
> benefit from the automatically implemented <=>, i.e.
>
> Person = Struct.new :age, :name, :position
>
> an_array = [
> Person.new(4, "joe", 1),
> Person.new(2, "arthur", 2),
> Person.new(3, "william", 5),
> ]
>
> Kind regards
>
> robert

thanks Robert , I'll write that in my NoteTaker Ruby book !!

Alexey Zilber

4/7/2009 3:30:00 AM

0

Hi,

Was going through these older posts and have a similar question. I
have a nested array that contains a date and a filename. I'm trying to
sort by file date.

The array is in the form:

SortedFiles = [ [200904031109, "filea.txt"], [200904031337,
"fileb.txt"], [200904031110, "filec.xt"] ]

What I was trying to do was:

SortedFiles.sort { |[[a,b],[x,y]] a < x | }

That, unfortunately, did not work. I'm using Ruby 1.8.5 btw. Can anyone
help out?

Thanks,
Alex

Stefano Crocco wrote:
> On Saturday 31 May 2008, Erwin wrote:
>> aSortedArray = [ [20, "ernesto", 17], [1, "joe", 4], 5, "william", 3],
>> [2, "arthur", 2], [28, "barbara", 2], [16, "bob", 1] ]
>>
>> any doc link where this is explained ?
>>
>> thanks a lot for your tip
>
> You can do this:
>
> aSortedArray = anArray.sort do |a, b|
> if a[2] == b[2] then a[1] <=> b[1]
> else a[2] <=> b[2]
> end
> end
>
> If the third element of the two subarrays are equal, then the block
> returns
> the result of the comparison of the second elements (using <=>),
> otherwise it
> returns the result of the comparison of the third elements, again using
> <=>.
>
> I hope this helps
>
> Stefano

--
Posted via http://www.ruby-....

Christopher Dicely

4/7/2009 4:31:00 AM

0

On 4/6/09, Alexey Zilber <alexeyzilber@gmail.com> wrote:
> Hi,
>
> Was going through these older posts and have a similar question. I
> have a nested array that contains a date and a filename. I'm trying to
> sort by file date.
>
> The array is in the form:
>
> SortedFiles = [ [200904031109, "filea.txt"], [200904031337,
> "fileb.txt"], [200904031110, "filec.xt"] ]
>
> What I was trying to do was:
>
> SortedFiles.sort { |[[a,b],[x,y]] a < x | }
>
> That, unfortunately, did not work. I'm using Ruby 1.8.5 btw. Can anyone
> help out?

SortedFiles.sort_by {|date, fname| date}
or:
SortedFiles.sort {|record1,record2| record1[0]<=>record2[0]}

Rick DeNatale

4/7/2009 12:26:00 PM

0

[Note: parts of this message were removed to make it a legal post.]

On Tue, Apr 7, 2009 at 12:31 AM, Christopher Dicely <cmdicely@gmail.com>wrote:

> On 4/6/09, Alexey Zilber <alexeyzilber@gmail.com> wrote:
> > Hi,
> >
> > Was going through these older posts and have a similar question. I
> > have a nested array that contains a date and a filename. I'm trying to
> > sort by file date.
> >
> > The array is in the form:
> >
> > SortedFiles = [ [200904031109, "filea.txt"], [200904031337,
> > "fileb.txt"], [200904031110, "filec.xt"] ]
> >
> > What I was trying to do was:
> >
> > SortedFiles.sort { |[[a,b],[x,y]] a < x | }
> >
> > That, unfortunately, did not work. I'm using Ruby 1.8.5 btw. Can anyone
> > help out?
>
> SortedFiles.sort_by {|date, fname| date}
> or:
> SortedFiles.sort {|record1,record2| record1[0]<=>record2[0]}
>
>
Since you are sorting on the first element of each array you can just use
SortedFiles.sort

Array comparison with another array works by using the comparison of the
first pair of elements which aren't equal, so [1,1] < [2,0] < [2,1]


--
Rick DeNatale

Blog: http://talklikeaduck.denh...
Twitter: http://twitter.com/Ri...
WWR: http://www.workingwithrails.com/person/9021-ric...
LinkedIn: http://www.linkedin.com/in/ri...