Tri décroissant par valeur d’un hachage en rbuy

Mon entrée hash: h = { "a" => 20, "b" => 30, "c" => 10 }

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

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

Comment pouvons-nous le faire fonctionner dans l’autre sens, que signifie ?

Vous pouvez l’avoir plus propre, plus clair et plus rapide, tout à la fois! Comme ça:

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

J’ai comparé les timings sur 3000 itérations de sorting d’un hachage de 1000 éléments avec des valeurs aléatoires, et 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 
 h.sort {|a,b| b[1]<=>a[1]} 

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

Super simple: h.sort_by { |k, v| -v } h.sort_by { |k, v| -v }