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 :

Tri d'un tableau spécial: comment faire que tout se suivent?


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2002
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 88
    Points : 49
    Points
    49
    Par défaut Tri d'un tableau spécial: comment faire que tout se suivent?
    Bonjour,

    Voila, je dispose d'un tableau contenant que des string, mon tableau se présentente ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    col1persB | col2persB | col3persB | nompersB | col1persC | col2persC | col3persC | nompersC | col1persA | col2persA | col3persA | nompersA
    Donc moi, je veux faire un tri en fonction des nompersX.

    Mais attention, je veux que les valeurs col1persX suivent le nompersX, de sorte que mon tableau une est comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     col1persA | col2persA | col3persA | nompersA | col1persB | col2persB | col3persB | nompersB | col1persC | col2persC | col3persC | nompersC
    Et donc je ne sais pas comment faire. Quelqu'un peu t'il m'aider sur ce sort??

    Merci

  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
    Il suffit d'expliquer à sort ce que tu veux faire

    Je ne suis pas sûr d'avoir tout compris à ta structure de tri, mais l'exemple suivant peut peut-être t'éclairer :

    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
    #!perl
     
    use strict;
    use warnings;
     
    @tab = qw (col1persB col2persB col3persB nompersB col1persC col2persC col3persC nompersC col1persA col2persA col3persA nompersA);
     
    @tab = sort { my ($noma) = ($a =~ m/pers(.*)/) ; 
                  my ($nomb) = ($b =~ m/pers(.*)/) ; 
                  (($noma cmp $nomb) or ($a cmp $b))
                  } @tab;
     
    $, = ", ";      
    print @tab;
    print "\n";
    Dans le bloc du sort, j'extrais (au moyen d'une RE, dans ce cas) une des informations partielles de tri, puis, en fin de bloc, j'écris le test de comparaison, composé d'une comparaison sur l'information partielle précédent une comparaison sur l'info complète.

    C'est le test de comparaison qui est, finalement, le plus dur à écrire (sans se tromper ...)

    Bonne continuation.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2002
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 88
    Points : 49
    Points
    49
    Par défaut
    Merci,

    Mais voila, je ne connait pas a l'avance les nomX, je sais juste que le noms des personnes se trouve la dedans est toujours en position modulo 5.

    Mon tri je veux le faire sur la base de la valeur se trouvant en position 5
    Je veux trier les noms par ordre alphabetique, tout en faisant attention a se que ses valeur col1nomX, col2nomX et col3nomX le suive.

    Ou alors j'ai pas compris ton prog

  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 danje
    Mais voila, je ne connait pas a l'avance les nomX, je sais juste que le noms des personnes se trouve la dedans est toujours en position modulo 5.
    J'ai utilisé une regexp simplement pour montrer une façon d'extraire l'information ... Ta spécification n'était pas très claire et je ne savais pas ce qui faisait partie des données et ce qui était artefact de traitement ...

    Si l'élément de tri est toujours au même endroit (position 5, par exemple), la fonction substr va nous permettre de le retrouver.

    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
    #!perl
     
    use strict;
    use warnings;
     
    my @tab = qw (col1_persB col2_persB col3_persB nom__persB col1_persC col2_persC col3_persC nom__persC col1_persA col2_persA col3_persA nom__persA);
     
    @tab = sort { my $noma = substr ($a, 5) ; 
                  my $nomb = substr ($b, 5) ; 
                  (($noma cmp $nomb) or ($a cmp $b))
                  } @tab;
     
    $, = ", ";      
    print @tab;
    print "\n";
    Citation Envoyé par danje
    Mon tri je veux le faire sur la base de la valeur se trouvant en position 5
    C'est chose faite avec ce nouveau code, très similaire à l'ancien, toutefois. Le principe est le même, seule l'extraction de l'information de tri change.

    Citation Envoyé par danje
    Je veux trier les noms par ordre alphabetique, tout en faisant attention a se que ses valeur col1nomX, col2nomX et col3nomX le suive.
    Dans l'exemple que tu as donné, les valeurs colX le précèdent ... j'ai donc suivi une de tes spécifications, et pas l'autre ... il faut choisir laquelle est la bonne.


    A la limite, poste des données relativement conformes à tes données réelles, car la notion de nom, colX et persX brouille un peu la description du problème. On ne sait pas trop si cela fait partie des données ou non.


    Bonne continuation.




    Citation Envoyé par danje
    Ou alors j'ai pas compris ton prog
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2002
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 88
    Points : 49
    Points
    49
    Par défaut
    En fait, j'ai ceci dans mon tableau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    classe | localisation | personne1 | classe | localisation | personne2 | classe | localisation | personne3
    Voila, ma situation veridique: donc mes information a traiter se situe toujours en multiple de 3 postion: 3 / 6 / 9...

    Moi je veux trier donc par nom de personne et faire en sorte que sa classe et sa localisation le suive (donc les 2 colonne avant le nom de la personne dans mon exemple )

    Bon, meme si je en trouve pas comment faire c'est pas trop grave, on m'a expliquer une snytaxe SQL sur le forum pour faire ce que je veux. du coup le tri a je peux l'abandonner, mais ça m'interesse qd meme de savoir comment le faire

  6. #6
    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
    Alors, Perl, tout seul, n'intègre rien pour le faire spécifiquement ...

    Par contre, en y réfléchissant un petit peu ... c'est finalement assez facile en utilisant le principe (algorithmique) de la table d'indexage (ou Look Up Table, LUT).

    Ainsi, le code suivant est efficace :
    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    my @tab = qw (Rouge Fraise Tom Vert Cerise Kim Jaune Pomme Raul Bleu Melon Brad);
     
    my @indices = map { ($_ * 3) + 2 } (0..((@tab-1) / 3));
     
    @indices = sort { $tab[$a] cmp $tab[$b] } @indices;
     
    my @tab_trie = map { ($tab[$_], $tab[$_-2], $tab[$_-1]) } @indices;
     
    $, = ", ";
    print @tab_trie;
    print "\n";
    On y définit un tableau avec des noms de personnes précédées de leur couleur et de leur fruit préféré.

    On définit un tableau d'indexage, @indices, qui contient les indices des positions des noms dans notre tableau général.

    On trie ensuite ce tableau d'indexage selon le nom (ordre alphabétique). Ce tri est indirect : on trie les données selon la valeur indéxée.

    Ensuite, on prend ces indices dans l'ordre du tri et l'on régénère le tableau qui nous convient en prenant les valeurs aux indices et les valeurs associés (indices voisins, à l'intérieur de la granularité liée au nombre d'éléments par t-uple).


    Ce n'est pas si compliqué, finalement (et de bonnes bases, en algorithmique, c'est BIEN !)

    On peut aussi passer par des tables de hachage, mais bon ... une solution qui marche, c'est déjà bien, même s'il y a plusieurs façons de le faire


    Si avec ça je n'ai pas mérité un tag [Résolu]
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2002
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 88
    Points : 49
    Points
    49
    Par défaut
    Tout a fait, merci pour l'explication.

    Je mets de coté ;-) parceque comme je l'ai dis je regle ça en SQL plus rapidemment ;-)

    Merci en tout cas

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/08/2009, 15h08
  2. Réponses: 8
    Dernier message: 22/06/2009, 18h06
  3. Réponses: 0
    Dernier message: 11/02/2009, 13h53
  4. tableau bidimensionnels comment faire?
    Par yvon_huynh dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 18/08/2006, 08h15
  5. [XSLT] Tri de date par mois : comment faire ?
    Par sdkddk dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 04/08/2006, 21h37

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