67 votes

Tri descendant par valeur d'un Hash en Ruby

Ma contribution hash : h = { "a" => 20, "b" => 30, "c" => 10 }

Tri croissant : h.sort {|a,b| a[1]<=>b[1]} #=> [["c", 10], ["a", 20], ["b", 30]]

Mais j'ai besoin [["b", 30], ["a", 20], ["c", 10]]

Comment pouvons-nous faire fonctionner le système dans l'autre sens ? <=> signifier ?

177voto

glenn mcdonald Points 8933

Vous pouvez l'avoir plus propre, plus clair et plus rapide, tout à la fois ! Comme ceci :

h.sort_by {|k,v| v}.reverse

J'ai comparé les temps sur 3000 itérations de tri d'un hachage de 1000 éléments avec des valeurs aléatoires, et j'ai obtenu ces temps :

h.sort {|x,y| -(x[1]<=>y[1])} -- 16.7s
h.sort {|x,y| y[1] <=> x[1]} -- 12.3s
h.sort_by {|k,v| -v} -- 5.9s
h.sort_by {|k,v| v}.reverse -- 3.7

11voto

Paul Odeon Points 534

C'est très simple : h.sort_by { |k, v| -v }

11voto

demas Points 10567
h.sort {|a,b| b[1]<=>a[1]}

9voto

Chuck Points 138930

<=> compare les deux opérandes, en renvoyant -1 si le premier est inférieur, 0 s'ils sont égaux et 1 si le premier est supérieur. Cela signifie que vous pouvez simplement faire -(a[1]<=>b[1]) pour inverser l'ordre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X