Eu tenho um contador de hash que estou tentando classificar por contagem. O problema que eu estou enfrentando é que a função Hash.sort padrão classifica números como seqüências de caracteres e não por tamanho de número.
ie Hash dado:
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 classificada:
[ 'siteb.com', 9, 'sitea.com', 745, 'sitec.com', 10]
Embora 745 seja um número maior que 9, 9 será exibido primeiro na lista. Ao tentar mostrar quem tem a maior contagem, isso está dificultando minha vida. :)
Alguma idéia de como classificar um hash (ou mesmo um array) pelo tamanho do valor numérico?
Agradeço qualquer ajuda.
Respostas:
Não faço ideia de como você obteve seus resultados, pois ele não classificaria por valor da string ... Você deve reverter
a1
ea2
no seu exemploA melhor maneira, em qualquer caso (conforme Mladen), é:
Se você precisar de um hash como resultado, poderá usar
to_h
(no Ruby 2.0+)fonte
sort_by{|k,v| v}
metrics.sort_by{ |k, v| v }.reverse.to_h
Como value é a última entrada, você pode:
fonte
&:last
?sort_by(&:last)
é efetivamente abreviada parasort_by {|x| x.last}
stackoverflow.com/questions/1217088/...Já respondeu mas ainda. Mude seu código para:
Convertido em strings ao longo do caminho ou não, isso fará o trabalho.
fonte
Não é esse o comportamento que estou vendo:
É possível que, em algum ponto da linha, seus números estejam sendo convertidos em strings? Há mais código que você não está postando?
fonte