update rails create array ruby hash

rails - ¿Cómo ordenar un Ruby Hash por valor numérico?



ruby hash to json (4)

Como value es la última entrada, puede hacer:

metrics.sort_by(&:last)

Tengo un hash contador que intento ordenar por conteo. El problema al que me estoy enfrentando es que la función predeterminada Hash.sort ordena números como cadenas en lugar de por tamaño de número.

es decir, dado Hash:

metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 }

Ejecutando este código:

metrics.sort {|a1,a2| a2[1]<=>a1[1]}

devolverá una matriz ordenada:

[ ''siteb.com'', 9, ''sitea.com'', 745, ''sitec.com'', 10]

Aunque 745 es un número mayor que 9, 9 aparecerá primero en la lista. Cuando trato de mostrar quién tiene el conteo más alto, esto me está haciendo la vida difícil. :)

¿Alguna idea sobre cómo ordenar un hash (o incluso un array) por tamaño de valor numérico?

Agradezco cualquier ayuda.


Ese no es el comportamiento que estoy viendo:

irb(main):001:0> metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 } => {"siteb.com"=>9, "sitec.com"=>10, "sitea.com"=>745} irb(main):002:0> metrics.sort {|a1,a2| a2[1]<=>a1[1]} => [["sitea.com", 745], ["sitec.com", 10], ["siteb.com", 9]]

¿Es posible que en algún momento sus números se conviertan en cadenas? ¿Hay más código que no estás publicando?


No tengo idea de cómo obtuviste tus resultados, ya que no ordenaría por valor de cadena ... Deberías invertir a1 y a2 en tu ejemplo

La mejor manera en cualquier caso (según Mladen) es:

metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 } metrics.sort_by {|_key, value| value} # ==> [["siteb.com", 9], ["sitec.com", 10], ["sitea.com", 745]]

Si necesita un hash como resultado, puede usar to_h (en Ruby 2.0+)

metrics.sort_by {|_key, value| value}.to_h # ==> {"siteb.com" => 9, "sitec.com" => 10, "sitea.com", 745}


Ya respondí pero aún. Cambia tu código a:

metrics.sort {|a1,a2| a2[1].to_i <=> a1[1].to_i }

Convertido a cadenas en el camino o no, esto hará el trabajo.