Simulation de tri d'une hash

Simulation de tri d'une hash - Perl - Programmation

Marsh Posté le 12-09-2005 à 12:33:08    

Bonjour,
 
je cherche à effectuer un tri sur les éléments d'une hash.
Je sais que l'utilisation d'un tableau aurait été plus recommandé mais pas dans mon cas, vu l'utilisation que je fais de ma structure.
 
Ce que j'ai cherché a faire :
- récupérer les clés de mon tableau
- faire un sort sur mon tableau pour trier les clés en fonction des valeurs de ma hash
- parcourir ma hash dans l'ordre grace au tableau précédent
 
Je pensais que ca marchait mais en fait non, apparement ca fait intervenir je ne sais quoi d'aléatoire (le rangement des hash en mémoire?) qui fait que j'arrive a obtenir des résultats étranges...
 
J'ai fait un test vite fait pour me montrer que ca ne marchait pas mais j'aimerai bien comprendre pourquoi, et évidemment le faire fonctionner...
 
Voila le code :

Code :
  1. #!/usr/bin/perl -w
  2. use warnings;
  3. use strict;
  4. use Data::Dumper;
  5. my %hash_test = ('zservice1'=>101,'gservice2'=>201,'lservice3'=>301,'aservice4'=>401,'oservice5'=>501,'bservice6'=>601);
  6. my @liste_cles = keys %hash_test;
  7. print "Liste non triée\n";
  8. print Dumper @liste_cles;
  9. // apparement c'est ici que ca cloche...
  10. my @liste_cles_tries = sort {$hash_test{$a} < $hash_test{$b}} @liste_cles;
  11. print "\nListe triée\n";
  12. print Dumper @liste_cles_tries;
  13. print "Terminé\n";


et voila ce que j'ai obtenu :
 

Liste non triée
$VAR1 = 'aservice4';
$VAR2 = 'gservice2';
$VAR3 = 'bservice6';
$VAR4 = 'lservice3';
$VAR5 = 'zservice1';
$VAR6 = 'oservice5';
 
Liste triée
$VAR1 = 'bservice6';
$VAR2 = 'aservice4';
$VAR3 = 'lservice3';
$VAR4 = 'gservice2';
$VAR5 = 'oservice5';
$VAR6 = 'zservice1';
Terminé


L'élément 5 s'est un peu perdu...
Si quelqu'un a une solution ou une autre idée pour ce problème, je suis preneur...
 
Merci :)

Reply

Marsh Posté le 12-09-2005 à 12:33:08   

Reply

Marsh Posté le 12-09-2005 à 13:53:32    

essai ca:
 
my @liste_cles_tries = sort {$hash_test{$a} <=> $hash_test{$b}}  @liste_cles;

Reply

Marsh Posté le 12-09-2005 à 13:55:51    

Reply

Marsh Posté le 12-09-2005 à 14:02:21    

Merci :)
 
Effectivement en lisant la doc de sort un peu plus attentivement, je viens de voir qu'il fallait utiliser <=> ou cmp.
 
Pour ma culture perso, ca correspond à qqchose d'utiliser des opérateurs "simples" dans le sort?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed