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 :

Trier une colonne dans un tableau


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Septembre 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 11
    Par défaut Trier une colonne dans un tableau
    Bonjour à tous,
    Je me permets de vous demander de l'aide pour savoir par ou commencer pour réaliser un tri dans un tableau :

    ==========voici le contenu du tableau==================
    002;0201;129;166;167;8;5;
    002;0207;129;166;167;8;5;
    002;0205;129;166;167;8;5;
    002;0204;129;166;167;8;5;
    002;0203;129;166;167;8;5;
    =================================================
    Le but étant de trier numériquement la colonne 2 dans laquelle il n'y a pas de doublon.


    Voici le code j'ai testé mais qui me donne une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    while ($Ligne_Fichier_Masterconfig = <Fichier_Base_extraction_masterconfig_sans_virgule> )
    	{
    		push(@Tab_Fichier_Masterconfig,$Ligne_Fichier_Masterconfig);
    	}
    	print "\n@Tab_Fichier_Masterconfig\n";	
     
     
    	@Tab_Fichier_Masterconfig_trie = sort { $a->[2] <=> $b->[2] } @Tab_Fichier_Masterconfig; 
    	print "@$_\n" for @Tab_Fichier_Masterconfig_trie;
    Je vous remercie d'avance pour votre aide ou piste.


    A bientôt
    Jules

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Il faudrait stocker le tout dans un hash avec en clé la colonne 2 d'intérêt.

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    En partant de ton script (qui se base sur un tableau simple et non hash comme suggéré par djibril), il faut corriger au moins deux choses :
    - lors de la construction du tableau, chaque ligne est lue, mais pas découpée en colonnes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ($Ligne_Fichier_Masterconfig = <Fichier_Base_extraction_masterconfig_sans_virgule> )
    	{
    		push @Tab_Fichier_Masterconfig, [ split /;/, $Ligne_Fichier_Masterconfig ];
    	}
    - lors du tri, tu testes l'élément d'indice 2. Or la deuxième colonne se trouve à l'indice 1.

    En corrigeant ces deux erreurs, le script devrait fonctionner un peu mieux.
    L'alternative de djibril est intéressante si les clés sont uniques (et uniquement dans ce cas).

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    L'alternative de djibril est intéressante si les clés sont uniques (et uniquement dans ce cas).
    Citation Envoyé par calimero642-fr
    Le but étant de trier numériquement la colonne 2 dans laquelle il n'y a pas de doublon.

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    J'avais bien lu cette remarque
    J'ai simplement souhaité élargir le contexte.

    Je propose ici deux autres alternatives :
    1- celle de djibril, basée sur les hash
    2- celle utilisant la transformée Schwartzienne

    que je vais comparer en terme de performance avec DProf :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #!/usr/bin/perl
     
    my @table = <DATA>;
     
    sub hashage {
      my %table;
      foreach (@table) {
        my (undef, $key) = split /;/;
        $table{$key} = $_;
      }
      return map $table{$_}, sort keys %table;
    }
     
    sub schwarz {
      return map $_->[1], sort { $a->[0] <=> $b->[0] }
        map { my (undef, $key) = split /;/; [ $key, $_ ] } @table;
    }
     
    sub ToT {
      my @Tab_Fichier_Masterconfig;
      foreach my $Ligne_Fichier_Masterconfig ( @table )
        {
          push @Tab_Fichier_Masterconfig, [ split /;/, $Ligne_Fichier_Masterconfig ];
        }
      return map { join ";", @$_ } sort { $a->[1] <=> $b->[1] } @Tab_Fichier_Masterconfig;
    }
     
    print "Table initiale:\n", @table;
    print "Méthode hashage:\n", hashage;
    print "Méthode schwartzienne:\n", schwarz;
    print "Méthode table de table:\n", ToT;
    foreach (2 .. 10000) {
      hashage;
      schwarz;
      ToT;
    }
     
    __DATA__
    002;0201;129;166;167;8;5;
    002;0207;129;166;167;8;5;
    002;0205;129;166;167;8;5;
    002;0204;129;166;167;8;5;
    002;0203;129;166;167;8;5;
    Résultats :
    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
    29
    30
    31
    32
    $ perl -d:DProf tri.pl && dprofpp
    Table initiale:
    002;0201;129;166;167;8;5;
    002;0207;129;166;167;8;5;
    002;0205;129;166;167;8;5;
    002;0204;129;166;167;8;5;
    002;0203;129;166;167;8;5;
    Méthode hashage:
    002;0201;129;166;167;8;5;
    002;0203;129;166;167;8;5;
    002;0204;129;166;167;8;5;
    002;0205;129;166;167;8;5;
    002;0207;129;166;167;8;5;
    Méthode schwartzienne:
    002;0201;129;166;167;8;5;
    002;0203;129;166;167;8;5;
    002;0204;129;166;167;8;5;
    002;0205;129;166;167;8;5;
    002;0207;129;166;167;8;5;
    Méthode table de table:
    002;0201;129;166;167;8;5;
    002;0203;129;166;167;8;5;
    002;0204;129;166;167;8;5;
    002;0205;129;166;167;8;5;
    002;0207;129;166;167;8;5;
    Total Elapsed Time = 1.687981 Seconds
      User+System Time = 1.596981 Seconds
    Exclusive Times
    %Time ExclSec CumulS #Calls sec/call Csec/c  Name
     57.4   0.917  0.917  10000   0.0001 0.0001  main::ToT
     25.9   0.414  0.414  10000   0.0000 0.0000  main::hashage
     23.9   0.382  0.382  10000   0.0000 0.0000  main::schwarz
    Un deuxième essai montre des valeurs un peu différentes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Total Elapsed Time = 1.727987 Seconds
      User+System Time = 1.684987 Seconds
    Exclusive Times
    %Time ExclSec CumulS #Calls sec/call Csec/c  Name
     49.7   0.839  0.839  10000   0.0001 0.0001  main::ToT
     30.8   0.519  0.519  10000   0.0001 0.0001  main::schwarz
     25.0   0.422  0.422  10000   0.0000 0.0000  main::hashage
    En gros, la méthode Schwartzienne et par table de hashage se valent, et sont grosso-modo deux fois plus efficaces que l'algorithme initial optimisé.

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut

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

Discussions similaires

  1. Masquer une colonne dans un tableau sous ffx
    Par Mengué georges dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 15/02/2010, 08h57
  2. [algo] insérer une colonne dans un tableau
    Par nightcyborg dans le forum C#
    Réponses: 4
    Dernier message: 30/10/2009, 23h12
  3. Detecter une colonne dans un tableau
    Par LordDaedalus dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 17/11/2008, 11h45
  4. [Tableaux] Total d'une colonne dans un tableau
    Par carmen256 dans le forum Langage
    Réponses: 4
    Dernier message: 25/03/2007, 12h42
  5. [HTML] Pb pour inserer une colonne dans un tableau
    Par cchampion2fr dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 11/11/2006, 11h41

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