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 :

[langage] tri avancé, liste de listes


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    Points : 54
    Points
    54
    Par défaut [langage] tri avancé, liste de listes
    Bonjour !
    je voudrais trier une liste de listes du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @maliste = (['a', ['a1','a2','a3']],
    ['c', ['c1', 'c2', 'c3']],
    ['b', ['b1', 'b2', 'b3']]
    );
    afin d'obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @resultat = (['a', ['a1','a2','a3']],
    ['b', ['b1', 'b2', 'b3']],
    ['c', ['c1', 'c2', 'c3']]
    );
    càd, trier les sous listes selon leur premier élément.

    J'ai essayé ça qui me parait logique mais qui ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @resultat = sort {$maliste[$a]->[0] cmp $maliste[$b]->[0]} @maliste;
    Une idée ?

  2. #2
    En attente de confirmation mail
    Inscrit en
    Mars 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 67
    Points : 75
    Points
    75
    Par défaut
    est-ce que je me trompe en disant qu'un simple
    va le forcer à trier sur le premier élément de chaque liste?

  3. #3
    En attente de confirmation mail
    Inscrit en
    Mars 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 67
    Points : 75
    Points
    75
    Par défaut
    je me trompais, ça ne marche pas...

    il fallait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @resultat = sort {$$a[0] cmp $$b[0]} @maliste;

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    Points : 54
    Points
    54
    Par défaut
    Oui super !!!

    mais je vois pas trop pourquoi mon idée à moi ne marchait pas...
    Si tu pouvais essayer d'expliquer le $$a, ce serait vraiment sympa!

    En tous cas merci beaucoup, t'es un ange!

  5. #5
    En attente de confirmation mail
    Inscrit en
    Mars 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 67
    Points : 75
    Points
    75
    Par défaut
    en fait quand tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my @liste = (b, c, a);
    my @resultat = sort @liste;
    tu fais implicitement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my @resultat = sort{$a cmp $b} @liste;
    avec $a et $b qui représentent, itérativement, le contenu de @liste;
    ainsi, $a prend successivement les valeur b, c et a.
    Dans ton cas, ce que tu as à la place de b, c et a ce sont des tableaux anonymes ($a et $b représentent les références de ces tableaux): si tu compares $a cmp $b, tout ce que tu vas faire, c'est comparer les chaînes ARRAY(0x....) qui représentent les adresses mémoires de tes tableaux. Pour avoir le premier élément de chacun de ces tableaux, il faut donc comparer $$a[0] et $$b[0]

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    Points : 54
    Points
    54
    Par défaut
    Merci d'avoir pris le temps pour l'explication.
    J'avais bien compris pourquoi ne fonctionne pas. Ca, ok.
    Mais pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort {$maliste[$a]->[0] cmp $maliste[$b]->[0]} @maliste
    ne fonctionne pas, là j'ai du mal.
    Parce que si j'essaie de printer $maliste[$i]->[0], j'obtiens bien les éléments que je veux comparer... (1er element de chaque sous-liste). Donc a priori, le sort devrait marcher, non?
    Peut-être que dans la sub anonyme, il ne faut mettre que des variables standard, et pas de "maliste" ou quoi que ce soit ...

  7. #7
    En attente de confirmation mail
    Inscrit en
    Mars 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 67
    Points : 75
    Points
    75
    Par défaut
    oui c'est ça, il ne faut pas de $maliste, puisque ce sont les $a et $b qui font référence aux éléments de @maliste.

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

Discussions similaires

  1. [langage] Supprimer un élément dans une liste
    Par myjuna dans le forum Langage
    Réponses: 15
    Dernier message: 06/08/2014, 11h49
  2. Regrouper une liste en liste de listes
    Par West01 dans le forum Prolog
    Réponses: 12
    Dernier message: 14/03/2008, 14h07
  3. Tri par rapport à une liste de clés primaires
    Par yoyot dans le forum Langage SQL
    Réponses: 10
    Dernier message: 23/06/2006, 12h48
  4. Tri d'une zone de liste par bouton
    Par illight dans le forum Access
    Réponses: 7
    Dernier message: 09/11/2005, 19h39
  5. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34

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