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 :

Etude d'un tableau


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 53
    Par défaut Etude d'un tableau
    Bjour,

    Je dispose d'un tableau avec des nombres dedans:

    123
    23456
    123
    3454
    342
    3454

    Je voudrais savoir combien de nombres différents il y a dedans (par exemple ici il y en a 4 (123,23456,3454 et 342)) et savoir combien de fois sont répétés tous les nombres (par exemple ici il y a 2 fois 123, 2 fois 3454, une fois 23456 et une fois 342).

    Pour savoir combien de nombre différents il y a, je me dis qu'en parcourant le tableau entièrement et en le comparant à chaque fois avec tous les précédents nombres parcouru ca devrait marcher mais je n'arrive pas à le coder...(dois je faire cela avec une double boucle for?).

    Par contre pour savoir combien de fois tel nombre est dans le tableau, j'avoue que je ne sais pas du tout comment faire...

    Merci d'avance pour vos illuminations!

    ++

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    Par défaut
    Hugh Ecthelion,

    Utilises une table de hachage. Tu connais ? C'est un tableau dont les indices (appelés clés) sont libres (chaine, entier...) et auxquels tu associes une valeur quelconque.

    L'idée est qu'à chaque nombre identifié, tu le considères comme une clé de hachage dont la valeur associée est le nombre d'occurences trouvées.

    Il te suffit dans un premier temps de parcourir ton flux/fichier et d'incrémenter le compteur associé au nombre que tu as trouvé.

    A la fin, le hachage que tu as construit de cette manière contient les informations qui t'intéressent...

    Simple, non ?

    Voici le code correspondant:
    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
     
      # On initialise notre table de hachage
      %hsOccurences = ();
      # On parcours tout le flux d'entrée standard
      while ( $sLine = <STDIN> ) {
        # On vire les retours chariot
        $sLine =~ s/(\r|\n)//g;
        # Si la chaine trouvée est lue pour la première fois (ie: elle n'est pas référencée dans notre table de hachage)
        if ( ! exists($hsOccurences{$sLine}) ) {
          # On indique qu'on vient de la lire pour la première fois
          $hsOccurences{$sLine} = 1;
        # Sinon
        } else {
          # On incrémente son nombre d'occurences
          $hsOccurences{$sLine} = $hsOccurences{$sLine} + 1;
        }
      }
     
      # On parcours toutes les clés de notre hachage
      foreach $sKey (keys %hsOccurences) {
        printf("Le nombre %s a été lu %d fois\n", $sKey, $hsOccurences{$sKey});
      }
     
      # On afficge le nombre d'occurences du nombre '123' si il a été lu
      printf("Le nombre 123 a été lu %d fois\n", $hsOccurences{'123'}) if ( exists($hsOccurences{'123'}) );
    Si tu as des questions, n'hésite pas

    PluX59

  3. #3
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 53
    Par défaut
    Merci beaucoup!!

    J'ai juste quelques questions:

    Pourquoi as t on besoin de retirer les retours chariots?

    Peux t on utiliser la fonction exists dans un tableau classique aussi?

    Merci encore pour ta réponse!

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    Par défaut
    Hello,

    Si tu ne retires pas les retours chariot, et que tu veuilles accéder manuellement à une donnée, le hachage ne te retournera pas la valeur associée (à moins que tu ne mettes un retour chariot à ta clé).

    Le retour chariot est considéré comme un caractère à part entière au moment d'associé une valeur à une clé

    La fonction exists ne fonctionne que pour les tables de hachage. Essaye un peu de le faire avec un tableau, et tu vas voir ce que Perl en pense

    PluX59

  5. #5
    Membre Expert Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Par défaut
    Tu peux simplifier le code:

    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
     
      use strict;
      use warnings;
     
      # On initialise notre table de hachage
      my %hsOccurences = ();
     
      # On parcours tout le flux d'entrée standard
      while ( my $item= <STDIN> ) {
        # On vire les retours chariot
        chomp($item);
        # on incrémente le nombre d'occurences trouvées pour l'élément
        $hsOccurences{$item}++;
      }
     
      # On parcours toutes les clés de notre hachage
      foreach my $item (sort keys %hsOccurences) {
        printf("Le nombre %s a été lu %d fois\n", $item, $hsOccurences{$item});
      }
    ou, si tu as déjà stocké tous les items dans un tableau:

    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
     
    use strict;
    use warnings;
     
    # tableau contenant les valeurs
    my @array = (123, 23456, 123, 3454, 342, 3454);
     
    # on compte les occurences de chaque nombre
    my %hashoccurences = ();
    map { $hashoccurences{$_}++ } @array;
     
    # on affiche le nombre d'occurences de chaque nombre:
    foreach my $item (sort keys %hashoccurences) {
        printf("Le nombre %s a été lu %d fois\n", $item, $hashoccurences{$item});
    }

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    Par défaut
    Hugh,

    Et on peut même tellement simplifier que ça sera totalement illisible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    use strict; use warnings;
    my %hs = (); my @a = <STDIN>; map { s/(\r|\n)//g; $hs{$_}++ } @a;
    map { printf("Le nombre %s a ete lu %d fois\n", $_, $hs{$_}) } sort(keys(%hs));
    Qui a osé dire que ça n'était pas lisible ?

    PluX59
    P.S: La déclaration de %hs & @a me gênent encore... Je suis sur qu'on peut s'en passer

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/05/2002, 19h46
  2. verification de doublons dans un tableau
    Par bohemianvirtual dans le forum C
    Réponses: 11
    Dernier message: 25/05/2002, 12h21
  3. transmision de tableau en parametre
    Par Horus dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/05/2002, 11h15
  4. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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