Re: stable sort_by?

I have to sort a list using a number of criterions (a,b,c,d) where d
“Team B”=>{:a=>0, :b=>-2, :c=>4, :d=>112 },
pp tmp
because of criterion d. Is it possible that sort_by is not
stable? Or
is there something I did wrong?

Wouldn’t this be simpler ? :

h.sort_by {|k,v| [v[:a],v[:b],v[:c],v[:d]]}.reverse

Best Regards,
Fred

Full Ack,

obviously sort_by isn’t stable:

test = [[1, ‘b’], [1, ‘c’], [0, ‘a’]]
p test.sort_by{|t|t[0]}

=> [[0, “a”], [1, “c”], [1, “b”]]
(ruby 1.8.2 (2004-12-25) [i386-mswin32])

cheers

Simon

Kroeger, Simon (ext) wrote:

Full Ack,

obviously sort_by isn’t stable:

test = [[1, ‘b’], [1, ‘c’], [0, ‘a’]]
p test.sort_by{|t|t[0]}

=> [[0, “a”], [1, “c”], [1, “b”]]
(ruby 1.8.2 (2004-12-25) [i386-mswin32])

Hummm not sure to understand … You asked for a sort on the first item
… So, in this case [1,“c”] and [1,“b”] are equivalent, and their order
is un-important …

If you do value the order of the 2nd item of the array too, you just
have to specify it :

test = [[1, ‘b’], [1, ‘c’], [0, ‘a’]]
p test.sort_by{|t| t }

=> [[0, “a”], [1, “b”], [1, “c”]]

Best Regards,
Fred

Frederick R. wrote:

test = [[1, ‘b’], [1, ‘c’], [0, ‘a’]]
p test.sort_by{|t| t }

=> [[0, “a”], [1, “b”], [1, “c”]]

which is the same as
test.sort

Christer

On Dec 13, 2005, at 3:54 AM, Kroeger, Simon (ext) wrote:

Hi,

end

Best Regards,
(ruby 1.8.2 (2004-12-25) [i386-mswin32])

cheers

Simon

class Array
def stable_sort
n = 0
sort_by {|x| n+= 1; [x, n]}
end
end

test = [[1, ‘b’], [1, ‘c’], [0, ‘a’]]
=> [[1, “b”], [1, “c”], [0, “a”]]

p test.stable_sort{|t|t[0]}
[[0, “a”], [1, “b”], [1, “c”]]

-Ezra Z.
WebMaster
Yakima Herald-Republic Newspaper
[email protected]
509-577-7732

Frederick R. wrote:

Hummm not sure to understand … You asked for a sort on the first item
… So, in this case [1,“c”] and [1,“b”] are equivalent, and their order
is un-important …

A stable sort will leave items in the original order if their keys are
equal. Since sort_by apparently is not a stable sort, the secondary
keys must be included as you suggested.