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 :

Un classique des méthodes de tri


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 62
    Points : 52
    Points
    52
    Par défaut Un classique des méthodes de tri
    Bonsoir à tous,

    Imaginez que vous ayez un tableau contenant des chaines de caractères (désignant des noms de fichiers) comme ceux la :
    abcdefgh-04-300104.pdf|abcdefgh-02-300105.pdf|abcdefgh-08-200305.pdf etc...(la séparation | c'est juste pour matérialiser les éléments du tableau bien sur).

    et que vous souhaitez utiliser comme clé de tri la sous chaine entre le "-" et l'extension, c'est à dire 300104 par exemple pour le premier élément, comment feriez vous ?

    J'ai essayé ca mais ca ne donne pas le classement souhaité :
    @NomFichiers = sort { substr($a, 13, 6) <=> substr($b, 13, 6) } @NomFichiers;

    Je pense que la solution à ce mini blème pourra servir à tous perliens pas très expérimentés.

  2. #2
    Membre habitué Avatar de Leishmaniose
    Homme Profil pro
    Ingénieur Bio-industries
    Inscrit en
    Novembre 2003
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur Bio-industries
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2003
    Messages : 145
    Points : 141
    Points
    141
    Par défaut
    1- boucle avec regex pour extraire chacune des sous chaînes (entre le second "-" et le "." de l'extension) et construire avec un tableau en utilisant push.

    2- sort du tableau des sous chaînes @sub_char.

    3- boucle imbriquée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach $i (0..$#sub_char) {
      foreach $j (0..$#NomFichiers) {
        if ($NomFichiers [$j] =~ $sub_char[$i]) { #pour plus de précision il est possible d'utiliser la regex de la 1ère étape avec $sub_char[$i]
          push @sorted, $NomFichiers[$j];
        }
      }
    }
    code non tester... Je serais intéressé d'entendre des critiques...

    @+

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 62
    Points : 52
    Points
    52
    Par défaut Après essai
    et après avoir implémenté ton code de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    foreach $i (0..$#TableauSousChaineMatchee) { 
    foreach $j (0..$#NomFichiers) {  
    	if ($NomFichiers[$j] =~ $TableauSousChaineMatchee[$i]) { #pour plus de précision il est possible d'utiliser la regex de la 1ère étape avec $sub_char[$i]   
    	push (@sorted, $NomFichiers[$j]); 
    	}  
    	} 
    	}
    	print "@sorted \n";
    Je me retrouves avec l'ordre abcdefgh-08-090104.pdf abcdefgh-08-110107.pdf abcdefgh-08-190106.pdf abcdefgh-08-230105.pdf
    Je ne vois pas à quel endroit du code il y a une fonction de tri ou d'inversion ? Yé po pigé.

    Sinon j'ai trouvé une idée c'est : 1 Echanger les 6 chiffres de droites en lieu et place des 2 chiffres du millieu
    2. Lancer un sort basique.
    3. Replacer ces chaines dans leurs positions initiales :-)

  4. #4
    Membre habitué Avatar de Leishmaniose
    Homme Profil pro
    Ingénieur Bio-industries
    Inscrit en
    Novembre 2003
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur Bio-industries
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2003
    Messages : 145
    Points : 141
    Points
    141
    Par défaut
    Citation Envoyé par bros_70
    Je me retrouves avec l'ordre abcdefgh-08-090104.pdf abcdefgh-08-110107.pdf abcdefgh-08-190106.pdf abcdefgh-08-230105.pdf
    Je ne vois pas à quel endroit du code il y a une fonction de tri ou d'inversion ? Yé po pigé.
    D'abord et pour éviter toute ambigüité : mon code ne concernait que la partie 3- de ma réponse autrement dit la boucle imbriquée, il fallait donc faire 1- et 2- (regex -> tableau @sub_char -> tri). Bon, pour ce qui est du tri, avant d'aller plus loin soyons déjà d'accord que :

    abcdefgh-08-090104.pdf
    abcdefgh-08-110107.pdf
    abcdefgh-08-190106.pdf
    abcdefgh-08-230105.pdf

    sont bien trier dans l'ordre croissant des clés de tri (chiffre entre "-" et ".") vu que 090104 < 110107 < 190106 < 230105. Alors je suis désolé mais je n'ai rien compris de ton dernier post surtout la partie suivante :

    Citation Envoyé par bros_70
    Je ne vois pas à quel endroit du code il y a une fonction de tri ou d'inversion ? Yé po pigé.

    Sinon j'ai trouvé une idée c'est : 1 Echanger les 6 chiffres de droites en lieu et place des 2 chiffres du millieu
    2. Lancer un sort basique.
    3. Replacer ces chaines dans leurs positions initiales :-)

  5. #5
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par bros_70
    Bonsoir à tous,

    Imaginez que vous ayez un tableau contenant des chaines de caractères (désignant des noms de fichiers) comme ceux la :
    abcdefgh-04-300104.pdf|abcdefgh-02-300105.pdf|abcdefgh-08-200305.pdf etc...(la séparation | c'est juste pour matérialiser les éléments du tableau bien sur).

    et que vous souhaitez utiliser comme clé de tri la sous chaine entre le "-" et l'extension, c'est à dire 300104 par exemple pour le premier élément, comment feriez vous ?

    J'ai essayé ca mais ca ne donne pas le classement souhaité :
    @NomFichiers = sort { substr($a, 13, 6) <=> substr($b, 13, 6) } @NomFichiers;

    Je pense que la solution à ce mini blème pourra servir à tous perliens pas très expérimentés.
    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @NomFichiers = sort { substr($a, 12, 6) <=> substr($b, 12, 6) } @NomFichiers;
    Ca marchera mieux (note le 12 à la place de 13 : l'indexation d'une chaîne de caractère se fait à partir de 0).

    Vu la taille du tableau, ce n'est pas nécessaire ici, mais voici un excellent article sur les tris en Perl.

    --
    Jedaï

Discussions similaires

  1. Points faibles des méthodes classiques de localisation du visage
    Par Chatbour dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 12/12/2008, 13h28
  2. [Info] génération des méthodes parentes
    Par Popeye75 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 08/12/2005, 17h24
  3. JAVA - Passer des Objects à des méthodes
    Par canou94 dans le forum CORBA
    Réponses: 2
    Dernier message: 15/11/2005, 22h39
  4. Editeur de texte - liste des méthodes
    Par Carlito_superheros dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 30/03/2005, 12h52
  5. [Info]descriptif des méthode ?
    Par java_math dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 01/06/2004, 08h36

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