Comment trier un Ruby Hash alphabétiquement par des clés
Je suis en train de trier une table de Hachage par ordre alphabétique de la clé, mais je n'arrive pas à trouver un moyen de le faire sans la création de mon propre Tri de la classe. J'ai trouvé le code ci-dessous pour trier par valeur si c'est un entier et je suis en train de le modifier, mais ne pas avoir un peu de chance.
temp["ninjas"]=36
temp["pirates"]=12
temp["cheese"]=222
temp.sort_by { |key, val| key }
Mon but est de commander le Hash de la clé puis sortie les valeurs. Je vais devoir le faire plusieurs fois avec différents hachage des commandes, mais les mêmes valeurs.
source d'informationauteur Rilcon42
Vous devez vous connecter pour publier un commentaire.
En supposant que vous voulez la sortie à une valeur de hachage qui va itérer sur les touches dans l'ordre de tri, alors vous êtes presque là.
Hash#sort_by
retourne unArray
deArray
s, et l'intérieur des tableaux sont toutes les deux éléments.Ruby
Hash
a un constructeur qui peut consommer cette sortie.Essayez ceci:
Si votre hash a mélangé des types de clés, cela ne fonctionnera pas (Ruby ne sera pas automatiquement le tri entre le
String
s etSymbol
s par exemple) et vous obtiendrez un message d'erreur comme comparaison de Symbole avec de la Ficelle a échoué (ArgumentError). Si oui, vous pouvez modifier ci-dessus pourpour contourner le problème. Toutefois averti que les touches de toujours conserver les types qui pourraient causer des problèmes avec des hypothèses plus tard dans le code. Aussi, la plupart des classes intégrées en charge un
.to_s
méthode, de sorte que vous pouvez obtenir des résultats indésirables de ce que (comme ordre de tri inattendus pour les touches numériques, ou d'autres imprévus types).Vous pourriez, en outreconvertir les clés de
Strings
avec quelque chose comme ceci:. . . bien que cette approche permettrait de perdre des informations sur le type de la clé d'origine, rendant impossible de revenir à l'origine des données de manière fiable.
va créer une nouvelle table de Hachage par l'insertion de la clé/valeurs de
original_hash
par ordre alphabétique de la clé. Ruby 2.x hachages de se souvenir de leur ordre d'insertion, de sorte que cette nouvelle table de hachage apparaissent triés par clé si vous énumérer ou de sortie.Si vous insérez plusieurs éléments dans un non-ordre alphabétique, cela ne tiendra pas bien sûr.
Aussi, cela suppose que l'original clés de hachage sont tous triable/comparables.
Ruby de Hachage se souvient de son insertion commandez maintenant des jours, mais plus tôt Rubis < v1.9 ne pas. Mais, ne prenez pas la peine de tri de hachage comme il n'y a aucun avantage à le faire parce que, fondamentalement, une table de Hachage est un accès aléatoire de la structure. Cela signifie que les éléments sont tous accessibles à tout moment et il ne fera pas une différence si l'on est premier ou le dernier, vous pouvez y accéder de la même façon.
Que contrairement à un Tableau qui agit comme un séquentielle/fichier texte ou d'une chaîne ou d'une file d'attente et vous avez accès à linéairement par itération sur elle, qui, à ce moment, l'ordre des éléments de fait une grande différence.
Donc, avec un dièse, obtenir les clés, de les trier, et soit itérer sur la liste des clés ou de l'utilisation
values_at
pour récupérer toutes les valeurs à la fois. Par exemple:Certaines langues n'ont pas laissé de trier la table de hachage, et en y accédant via une liste triée des touches est le seul moyen d'extraire les éléments d'un ordre, donc c'est probablement une bonne idée pour ne pas tomber dans l'habitude de compter sur l'ordre des paires clé/valeur, et, au lieu de s'appuyer sur les touches.
Vous pouvez créer un nouveau hachage vide de tenir le tri de hachage de données. Parcourir le tableau retourné et charger les données dans la nouvelle table de hachage pour tenir le tri de hachage de données.
temp est maintenant égale à {"fromage"=>222, "ninjas"=>36, les "pirates"=>12}