new - ruby hash each key value




Como classificar um Ruby Hash pelo valor numérico? (3)

Como value é a última entrada, você pode fazer:

metrics.sort_by(&:last)

Eu tenho um contador que estou tentando classificar por contagem. O problema que estou correndo é que a função Hash.sort padrão classifica números como strings ao invés de tamanho de número.

Ou seja, dado Hash:

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

Executando este código:

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

retornará uma matriz ordenada:

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

Mesmo que 745 seja um número maior que 9, 9 aparecerá primeiro na lista. Ao tentar mostrar quem tem a maior contagem, isso está dificultando minha vida. :)

Alguma idéia sobre como classificar um hash (ou um array uniforme) pelo tamanho do valor numérico?

Eu aprecio qualquer ajuda.


Esse não é o comportamento que estou vendo:

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]]

É possível que em algum lugar ao longo da linha seus números estejam sendo convertidos em strings? Existe mais código que você não está postando?


Não faço ideia de como você obteve seus resultados, já que não classificaria por valor de string ... Você deve reverter a1 e a2 no seu exemplo

Melhor maneira em qualquer caso (como por Mladen) é:

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]]

Se você precisar de um hash como resultado, você pode usar to_h (em Ruby 2.0+)

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




hash