J'ai un compteur de hachage que j'essaie de trier par compte. Le problème que je rencontre est que la fonction par défaut Hash.sort trie les nombres comme des chaînes plutôt que par leur taille.
c'est-à-dire compte tenu du hachage:
metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 }
Lancer 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 compte en tête, cela me rend la vie difficile. :)
Des idées sur la façon de trier un hachage (ou même un tableau) par taille de valeur numérique?
J'apprécie toute aide.
Aucune idée de la façon dont vous avez obtenu vos résultats, car cela ne trierait pas par valeur de chaîne ... Vous devriez inverser a1
et 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]]
Si vous avez besoin d'un hachage, vous pouvez utiliser to_h
(in Ruby 2.0+)
metrics.sort_by {|_key, value| value}.to_h
# ==> {"siteb.com" => 9, "sitec.com" => 10, "sitea.com", 745}
Puisque la valeur est la dernière entrée, vous pouvez faire:
metrics.sort_by(&:last)
Déjà répondu mais quand même. Changez votre code pour:
metrics.sort {|a1,a2| a2[1].to_i <=> a1[1].to_i }
Convertis en chaînes le long du chemin ou non, cela fera l'affaire.
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 que quelque part le long de la ligne, vos nombres soient convertis en chaînes? Y a-t-il plus de code que vous ne postez pas?