From: "Kroeger, Simon (ext)" Date: 2005-12-14T00:36:44+09:00 Subject: Re: stable sort_by? I guess you have to use sort instead of sort_by in such a case, like: test = [[1, 'b'], [1, 'c'], [1, 'a'], [0, 'a']] #sort for first item, than for second in reverse order p test.sort{|a, b|(a[0] <=> b[0]).nonzero? || (b[1] <=> a[1]) } =>[[0, "a"], [1, "c"], [1, "b"], [1, "a"]] cheers Simon > -----Original Message----- > From: list-bounce@example.com > [mailto:list-bounce@example.com] On Behalf Of Mike Fletcher > Sent: Tuesday, December 13, 2005 3:57 PM > To: ruby-talk ML > Subject: Re: stable sort_by? > > Frederick Ros wrote: > > h.sort_by {|k,v| [v[:a],v[:b],v[:c],v[:d]]}.reverse > > OK, this or something like it should be in the rdoc for > sort_by. I was > doing something similar and wound up writing a similar sort with > multiple if tests like the OP because I didn't remember that Array > implements a sane <=>. > > Also, would there be a similar cool way to do this in one > step where you > want a mix of ascending and descending sorts on different > parts? Say I > had a hash (in YAML): > > Bobby: > age: 11 > lastname: Smith > Suzy: > age: 13 > lastname: Jones > Ted: > age 12 > lastname: Smith > > And I wanted to sort > - alphabetically by lastname > - then age oldest to youngest > > So in Perl I'd do something like: > > my @sorted_keys = sort { $a->{lastname} cmp $b->{lastname} > || $b->{age} <=> $a->{age} } > keys %data; > > In this case I could use > > sorted_keys = data.sort_by { |k,v| [ v["lastname"], -1*v["age"] ] } > > But what if I wanted reverse alphabetically by lastname > (Z-A)? In perl > I'd swap $a and $b in the first comparison, but I can't think of a > spiffy way to do the same using sort_by. > > -- > Posted via http://www.ruby-forum.com/. > >