152 votes

Comment trier un Hash Ruby par valeur numérique ?

J'ai un compteur de hachage que j'essaie de trier par nombre. Le problème que je rencontre est que la fonction Hash.sort par défaut trie les nombres comme des chaînes de caractères plutôt que par taille de nombre.

c'est-à-dire un hachage donné :

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

J'exécute ce code :

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

retournera un tableau trié :

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

Même si 745 est un nombre plus grand que 9, 9 apparaîtra en premier dans la liste. Lorsque j'essaie de montrer qui a le plus grand nombre, cela me complique la vie :)

Une idée sur la façon de trier un hash (ou un tableau même) par taille de valeur numérique ?

J'apprécie toute aide.

264voto

Marc-André Lafortune Points 34140

Je n'ai aucune idée de la façon dont vous avez obtenu vos résultats, puisque le tri ne se fait pas par valeur de chaîne... Vous devriez inverser a1 y a2 dans votre exemple

Le meilleur moyen dans tous les cas (selon Mladen) est :

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

83voto

shock_one Points 467

Puisque la valeur est la dernière entrée, vous pouvez le faire :

metrics.sort_by &:last

14voto

dimitko Points 1408

Déjà répondu mais quand même. Changez votre code en :

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

Qu'il soit converti en cordes en cours de route ou non, il fera l'affaire.

9voto

Jacob Mattison Points 32137

Ce n'est pas le comportement que je vois :

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

Est-il possible qu'à un moment donné, vos chiffres soient convertis en chaînes de caractères ? Y a-t-il d'autres codes que vous n'affichez pas ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X