Comment trier un Rubis de Hachage par numéro de valeur?
J'ai un compteur de hachage que je suis en train de trier par comte. Le problème, je suis en cours d'exécution en est que le Hachage par défaut.fonction de tri trie les nombres comme des chaînes de caractères plutôt que par la taille.
soit, compte tenu de Hachage:
metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 }
L'exécution de ce code:
metrics.sort {|a1,a2| a2[1]<=>a1[1]}
va retourner un tableau trié:
[ 'siteb.com', 9, 'sitea.com', 745, 'sitec.com', 10]
Même si 745 est un nombre plus grand que 9, 9 apparaissent en premier dans la liste. Lorsque vous essayez de montrer qui a le haut le comte, c'est faire de ma vie difficile. 🙂
Toutes les idées sur la façon de trier une table de hachage (ou une matrice de même) par le nombre de la valeur de la taille?
J'apprécie toute l'aide.
- quelle version de ruby utilisez-vous? votre résultat de tri est très étrange
Vous devez vous connecter pour publier un commentaire.
Aucune idée de comment vous avez obtenu vos résultats, puisqu'il ne serait pas trier par chaîne de valeur... Vous devez inverser
a1
eta2
dans votre exempleMeilleure façon en tout cas (comme par Mladen) est:
Si vous avez besoin d'un hachage comme un résultat, vous pouvez utiliser
to_h
(en Ruby 2.0+)sort_by{|k,v| v}
Symbol
s sont comparables l'un à l'autre.h2.sort
travaille en Ruby 1.9 x ou 2.0.metrics.sort_by{ |k, v| v }.inject(Hash.new){ |h, a| h.merge!({a[0] => a[1]}) }
metrics.sort_by{ |k, v| v }.reverse.to_h
metrics.sort_by{|k,v| -v}
Étant donné que la valeur est la dernière entrée, vous pouvez faire:
&:last
?sort_by(&:last)
est effectivement un raccourci poursort_by {|x| x.last}
stackoverflow.com/questions/1217088/...Déjà répondu, mais encore. Modifiez votre code pour:
Convertis en chaînes le long de la voie ou pas, ce sera de faire le travail.
Ce n'est pas le comportement que je vois:
Est-il possible que quelque part le long de la ligne de vos numéros sont convertis en chaînes de caractères? Il y a plus de code que vous n'êtes pas à poster?