OVH Cloud OVH Cloud

Tri de hash et chaîne de caractères

4 réponses
Avatar
ctobini
Bonjour,

J'ai (=E0 nouveau) un petit probl=E8me avec les tris de hash :

Avec un tableau de type:

$h->{a}{b}{c}{rat} =3D 15;
$h->{a}{b}{c}{qual} =3D 'good'
$h->{a}{b}{c}{leng} =3D 200;
$h->{a}{b}{c}{pos} =3D 45;

$h->{a}{b}{d}{rat} =3D 15;
$h->{a}{b}{d}{qual} =3D 'best'
$h->{a}{b}{d}{leng} =3D 200;
$h->{a}{b}{d}{pos} =3D 45;

$h->{a}{b}{e}{rat} =3D 15;
$h->{a}{b}{e}{qual} =3D 'poor'
$h->{a}{b}{e}{leng} =3D 200;
$h->{a}{b}{e}{pos} =3D 45;

Je voudrais faire un tri des valeurs 'c' 'd' et 'e' en fonction de
plusieurs valeurs, par exemple 'rat' qui est num=E9rique :

foreach my $k3 ( sort { $h->{$k}{$k2}{$b}{rat} <=3D>
$probes->{$k}{$k2}{$a}{rat} } keys %{$h->{$k}{$k2}})

L=E0 j'ai bien un classement d=E9croissant de $k3 en fonction de 'rat'.

Par contre, si je veux faire un classement de$k3 par rapport =E0 'qual'
qui est une chaine de caract=E8re :

foreach my $k3 ( sort { $h->{$k}{$k2}{$a}{qual} <=3D>
$probes->{$k}{$k2}{$b}{qual} } keys %{$h->{$k}{$k2}})

Je n'ai pas de classement par ordre alphab=E9tique, ce qui me semble
normal vu que sort {$a<=3D>$b} est justement destin=E9 aux classements
num=E9riques.

Sauriez-vous comment indiquer au sort que la donn=E9e est une cha=EEne ?

En vous remerciant.

C=2E Tobini

4 réponses

Avatar
jl_morel
Dans l'article ,
a dit...
...[couic]
Je n'ai pas de classement par ordre alphabétique, ce qui me semble
normal vu que sort {$a<=>$b} est justement destiné aux classements
numériques.

Sauriez-vous comment indiquer au sort que la donnée est une chaîne ?



Pour un tri alphabétique, il faut utiliser cmp à la place de <=>
sort {$a cmp $b} ...

--
J-L.M.
http://www.bribes.org/perl

Avatar
ctobini
Bonjour et merci de la réponse, ça marche parfaitement pour les
chaîne, j'ai cependant un problème, je me triture la tête depuis ce
matin sans voir la solution.

Comme pour l'exemple de hash que j'ai donné dans le post, je voudrais
trier 'c', 'd' et 'e' selon 'qual' qui est une chaîne de caractères,
mais aussi selon 'rat' qui est numérique.

C'est à dire que selon les valeurs de 'qual' soit 'best', 'good' ou
'poor' faire une classification selon 'best' 'good' et 'poor' et
également les valeurs de 'rat'.

Le but est par exemple :

'good' = 1
'poor' = 15
'good' = 50
'best' = 20
'best' = 80
'poor' = 65

et d'avoir en tri :

'best' = 80
'best' = 20
'good' = 50
'good' = 1
'poor' = 65
'poor' = 15

=> tri par ordre alphabétique et numérique.

C. Tobini
Avatar
Paul Gaborit
À (at) 16 Feb 2006 06:08:24 -0800,
"ctobini" écrivait (wrote):
Le but est par exemple :

'good' = 1
'poor' = 15
'good' = 50
'best' = 20
'best' = 80
'poor' = 65

et d'avoir en tri :

'best' = 80
'best' = 20
'good' = 50
'good' = 1
'poor' = 65
'poor' = 15

=> tri par ordre alphabétique et numérique.


Exemple classique de tri sur deux clés.

La méthode simple (mais moins rapide) : il faut trier d'abord par la
clé secondaire (ici les valeurs numériques) puis par la clé primaire
(ici l'ordre alphabétique). Le sort de perl (qui est un tri bien
élevé) conserve l'ordre des élèments égaux.

La méthode plus efficace : faire une fonction de comparaison qui
compare la clé primaire puis la clé secondaire (mais uniquement en cas
d'égalité de la clé primaire).

On s'éloigne de plus en plus de Perl pour arriver vers des questions
d'algorithmiques classiques.

Pour y revenir, vous pourriez lire la FAQ de Perl en y cherchant le
mot 'sort' :

perldoc -q sort

Le cas du tri multi-clés y est traité... Un article intéressant y est
aussi cité :

<http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz>

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
ctobini
Bonjour et merci pour l'info, après avoir lu la doc de 'sort', j'ai pu
m'en tirer facilement grâce à un sort { $h->{a}{b1}{chaine} ||
$h->{a}{b2}{numérique} } qui trie des clés primaires identiques selon
une clés secondaire ( sort { primaire || secondaire } ).

Bonne journée,

C. Tobini