Comment sortinger un Ruby Hash par valeur numérique?

J’ai un compteur que je tente de sortinger par nombre. Le problème que je rencontre est que la fonction Hash.sort par défaut sortinge les nombres comme des chaînes plutôt que par leur taille.

c.-à-d. Hash donné:

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

Exécuter ce code:

 mesortingcs.sort {|a1,a2| a2[1]a1[1]} 

renverra un tableau sortingé:

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

Même si 745 est un nombre supérieur à 9, 9 apparaîtra en premier dans la liste. En essayant de montrer qui a le plus grand nombre, cela rend ma vie difficile. 🙂

Des idées sur la manière de sortinger un hachage (ou un tableau pair) par la taille de la 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 sortingerait pas par valeur de chaîne … Vous devriez inverser a1 et a2 dans votre exemple

Le meilleur moyen en tout cas (selon Mladen) est:

 mesortingcs = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 } mesortingcs.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 (dans Ruby 2.0+)

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

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

 mesortingcs.sort_by(&:last) 

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

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

Converti 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> mesortingcs = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 } => {"siteb.com"=>9, "sitec.com"=>10, "sitea.com"=>745} irb(main):002:0> mesortingcs.sort {|a1,a2| a2[1]<=>a1[1]} => [["sitea.com", 745], ["sitec.com", 10], ["siteb.com", 9]] 

Est-il possible que quelque part sur la ligne vos chiffres soient convertis en chaînes? Y a-t-il plus de code que vous ne postez pas?