IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

[PERL] Trier un tableau a deux dimensions


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [PERL] Trier un tableau a deux dimensions
    Bonjour,

    J'ai un tableau à deux dimensions comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     $tab_logins{Piregwan} = 17;
     $tab_logins{Nudrema} = 4;
     $tab_logins{Sylozof} = 150;
     $tab_logins{Gom} = 1;
    Je voudrais le trier sur les valeurs, pour qu'il soit dans cet ordre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     $tab_logins{Gom} = 1;
     $tab_logins{Nudrema} = 4;
     $tab_logins{Piregwan} = 17;
     $tab_logins{Sylozof} = 150;
    Avez vous une idée ? Merci !

    David

  2. #2
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut Re: [PERL] Trier un tableau a deux dimensions
    Bonjour,

    Citation Envoyé par piregwan
    J'ai un tableau à deux dimensions comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     $tab_logins{Piregwan} = 17;
     $tab_logins{Nudrema} = 4;
     $tab_logins{Sylozof} = 150;
     $tab_logins{Gom} = 1;
    Ce n'est pas un tableau, mais une table de hachage, ou liste hachée.

    Les tableaux sont indicés par des nombres et l'indice s'y exprime entre crochets (et en plus, le sigill des tableaux est un @ alors que celui des hachages est un %)

    Une liste hachée n'a qu'une "dimension" ...

    Par contre, c'est vrai qu'il y a deux "expressions" de son contenu : les valeurs et les clefs.

    Citation Envoyé par piregwan
    Je voudrais le trier sur les valeurs, pour qu'il soit dans cet ordre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     $tab_logins{Gom} = 1;
     $tab_logins{Nudrema} = 4;
     $tab_logins{Piregwan} = 17;
     $tab_logins{Sylozof} = 150;
    On ne peut pas trier une liste hachée. C'est perl qui décide de l'ordre des valeurs en mémoire. Cet ordre est innaccessible au programmeur et permet au langage de retrouver efficacement les données.

    Par contre, on peut quand même faire un affichage trié du contenu des valeurs.

    Ce tri peut porter soit sur l'ordre des clefs, soit sur l'ordre des valeurs.

    Pour faire ce tri, on trie les clefs de hachage selon notre critère, puis on affiche toutes les valeurs dans l'ordre de tri des clefs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    my %tab_logins;
     
    $tab_logins{Piregwan} = 17;
    $tab_logins{Nudrema} = 40;
    $tab_logins{Sylozof} = 150;
    $tab_logins{Gom} = 1;
     
    my @ordre;
     
    print "Ordre Arbitraire : ";
    @ordre = keys (%tab_logins);
    print $_."/".$tab_logins{$_}."   " foreach (@ordre);
    print "\n";
     
    print "Ordre des clefs : ";
    @ordre = sort keys (%tab_logins);
    print $_."/".$tab_logins{$_}."   " foreach (@ordre);
    print "\n";
     
    print "Ordre des valeurs : ";
    @ordre = sort { $tab_logins{$a} <=> $tab_logins{$b} } keys (%tab_logins);
    print $_."/".$tab_logins{$_}."   " foreach (@ordre);
    print "\n";

  3. #3
    Candidat au Club
    Inscrit en
    Décembre 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup pour la réponse très rapide !

    En visitant la FAQ, je m'étais orienté vers la meme solution. Ca donne ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my @liste = sort ( { $tab_logins{$b} <=> $tab_logins{$a} } keys(%tab_logins) );
    foreach my $clef (@liste)
    {
            print $clef;
            print $tab_logins{$clef};
    }
    tout ca pour faire ca : http://www.piregwan.com/webmail/conditions.php#logins


  4. #4
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par piregwan
    Joli 8)

    N'oublie pas de déposer le tag [Résolu] sur le sujet, en utilisant le bouton du même nom, en bas à gauche, quand tu visualises l'enfilade

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trier un tableau a deux dimension
    Par Carb0 dans le forum Langage
    Réponses: 1
    Dernier message: 11/12/2008, 18h03
  2. Réponses: 1
    Dernier message: 09/03/2006, 18h25
  3. Un string dans un tableau de deux dimensions...
    Par FinalSpirit dans le forum C++
    Réponses: 5
    Dernier message: 15/01/2006, 15h29
  4. Réponses: 6
    Dernier message: 26/11/2005, 20h55
  5. Réponses: 13
    Dernier message: 13/10/2005, 17h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo