Comment trier une table de hachage de hachages par clé en Perl?
Je veux une table de hachage qui est en fait un hash en valeur. Par exemple:
my %hash1=(
field1=>"",
field2=>"",
count=>0,
);
my %hash2;
$hash2{"asd"}={%hash1};
et j'ai inséré beaucoup de hachages pour %hash2
avec différentes valeurs de nombre de %hash2
.
Comment puis-je trier les %hash1
selon un décompte de la valeur de hash1
?
Est-il un moyen de le faire sans la mise en œuvre de quicksort manuellement, par exemple avec la fonction de tri de Perl?
- Voulez-vous dire que vous souhaitez obtenir la liste des hachages (comme hash1) triés par nombre de valeurs dans hash2?
- oui Jagmal cela signifie que je veux à l'égard de $hash2{"tsa"}{count}.
Vous devez vous connecter pour publier un commentaire.
De perlfaq4, la réponse à "http://faq.perl.org/perlfaq4.html#How_do_I_sort_a_hash" a la plupart des informations dont vous avez besoin pour composer votre code.
Vous pouvez également voir le chapitre sur le Tri de l'Apprentissage de Perl.
Chris a complètement amende de réponse, bien que je déteste utiliser
values
comme ça. Un plus familier façon de faire la même chose, c'est de passer par les touches de haut-niveau de hachage mais en quelque sorte par la touche de second niveau:Je le fais de cette façon parce que c'est un peu moins l'esprit de flexion.
Comment puis-je trier une table de hachage (éventuellement par valeur au lieu de la clé)?
(contribution de brian d foy)
Pour trier une table de hachage, de démarrage avec les touches. Dans cet exemple, nous donnons la liste des clés de la fonction de tri qui compare ensuite ces ASCIIbetically (qui pourraient être touchés par vos paramètres régionaux). La sortie de la liste a les clés en ASCIIbetical commande. Une fois que nous avons les clés, nous pouvons passer par eux pour créer un rapport qui dresse la liste des clés dans ASCIIbetical commande.
Nous avons pu obtenir plus de fantaisie dans le tri() bloc de bien. Au lieu de comparer les clés, nous pouvons calculer une valeur avec eux et d'utiliser cette valeur comme la comparaison.
Par exemple, pour faire notre rapport à l'ordre de la casse, nous utilisons le \L de la séquence dans une chaîne entre guillemets pour faire tout en minuscules. Le sort() bloc compare ensuite la lowercase valeurs pour déterminer l'ordre dans lequel mettre les clés.
Remarque: si le calcul est cher ou le hachage a beaucoup d'éléments, vous pouvez regarder la Schwartzian de se Transformer en cache les résultats de calcul.
Si nous voulons trier en fonction de la valeur de hachage au lieu de cela, nous utilisons la clé de hachage à le chercher. Nous avons encore sortir une liste de clés, mais cette fois, ils sont commandés par leur valeur.
À partir de là, nous pouvons obtenir plus complexe. Si les valeurs de hachage sont les mêmes, nous pouvons fournir un tri secondaire sur la clé de hachage.
Si vous souhaitez obtenir la liste des hachages (comme hash1) triés par nombre de valeurs dans hash2, cela peut vous aider:
Voir http://perldoc.perl.org/functions/sort.html pour beaucoup de contexte, comment trier les œuvres en Perl.
Et voici un exemple .. en essayant d'être lisible, pas perlish.
De trier par numérique utilisez <=> et pour la chaîne de l'utilisation du cpm.
Pour inverser l'ordre il suffit de remplacer $a et $b: