web-dev-qa-db-fra.com

Comment trier une valeur Ruby Hash by number?

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.

151
Dustin M.

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}
260

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

metrics.sort_by(&:last)
81
shock_one

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.

14
dimitarvp

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?

9
Jacob Mattison