sort_by sort descending ruby sorting hash

sort - Tipo descendente por valor de Hash en Ruby



ruby sort_by descending (4)

¡Puedes tenerlo más limpio, más claro y más rápido, todo a la vez! Me gusta esto:

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

Analicé los tiempos en 3.000 iteraciones de clasificación de un hash de 1000 elementos con valores aleatorios, y obtuve estos tiempos:

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

Mi hash de entrada: h = { "a" => 20, "b" => 30, "c" => 10 }

h.sort {|a,b| a[1]<=>b[1]} #=> [["c", 10], ["a", 20], ["b", 30]] ascendente: 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]]

Pero, necesito [["b", 30], ["a", 20], ["c", 10]]

¿Cómo podemos hacer que funcione al revés, qué significa <=> ?


Súper simple: h.sort_by { |k, v| -v } h.sort_by { |k, v| -v }


<=> compara los dos operandos, devolviendo -1 si el primero es más bajo, 0 si son iguales y 1 si el primero es más alto. Esto significa que puede hacer -(a[1]<=>b[1]) para invertir el orden.


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