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

Collection et Stream Java Discussion :

comparaison entre chaine dans un ArrayList et dans un fichier


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 181
    Par défaut comparaison entre chaine dans un ArrayList et dans un fichier
    Bonjour tout le monde,

    J'ai besoin de votre aide s'il vous plaît
    Je suis entrain d'implémenter une fonction qui permet de lire à partir d'un fichier.txt où chaque ligne est réprésenté sous cette format: (une chaine + : + nombre) par exemple (abc:30).
    J'ai une liste Arraylist qui contient des chaines.
    Je dois chercher dans le fichier les éléments existants dans la liste et faire extraire les nombres sinon je met zéro.

    voila j'ai essayé avec cette méthode :

    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
     
                  static void RechercheMotFichier(BufferedReader f, ArrayList<String> mot) throws FileNotFoundException, IOException {
                  Iterator<String> it = mot.iterator();
                  while (it.hasNext()) {
                  String m1 = it.next();
                  while (f.readLine() != null) {
                       String m2 = f.readLine();
                       String[] ligne = m2.split(":");
                       String Gm = ligne[0].toLowerCase(); 
                         if (m1.compareTo(Gm) == 0) // comparer les deux chaînes
                              {
                                int Fq = Integer.parseInt(ligne[1]);
                                System.out.println(Gm + " == " + Fq); }
                              }
                               }
                }
    Malheuresement , cette fonction ne donne pas le resultat souhaité , elle n'affiche pas tout les éléments existants.
    Aidez-moi de la corriger.

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Bien que tu aie deux boucle imbriquée, en réalité tu n'en a qu'une. La boucle intérieur ne se déclencera pas au deuxième passage de la boucle extérieur. En effet tu ne peux entamer ton deuxième passage sur la boucle extérieur que quand ta boucle intérieure a fini une première fois. Une fois son critère d'arrêt atteint, il reste valide et tu ne rentrera plus jamais dedans. Il faut réinitialiser ton critère d'arrêt à chaque boucle extérieure. Pour ça il faudrait réouvrir le reader et relire le fichier, ce qui n'est franchement pas très performant. Il vaut mieux tester directement chaque ligne du fichier avec l'ensemble des mots de ton arraylist, donc commencer par inverser tes boucles:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                  while (f.readLine() != null) {
                     String m2 = f.readLine();
                     while (it.hasNext()) {
                       String m1 = it.next();
    Tu as toujours le problème de réinitialise ton critère d'arrêt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                  while (f.readLine() != null) {
                     String m2 = f.readLine();
                     Iterator<String> it = mot.iterator();
                     while (it.hasNext()) {
                       String m1 = it.next();
    Et il te reste un dernier problème, dans ton test du while() tu lit un ligne et tu n'en fait rien, tu la jette, donc tu perds la moitié des entrées dans ton fichier, il faut donc corriger ça aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                  String m2 = null
                  while ( (m2=f.readLine()) != null) {
                     Iterator<String> it = mot.iterator();
                     while (it.hasNext()) {
                       String m1 = it.next();

  3. #3
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 181
    Par défaut
    Bonjour ,

    Merci tchize_ pour votre réponse, j'ai essayé de suivre ce que vous avez indiqué. Mais en core j'ai des mauvais resultats. Merci de m'aider
    en fait j'ai trois fonctions :
    1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static int ExtraireFreqChaine(String chaine) {
     
            String[] ligne = chaine.split(":");
            int Fq = Integer.parseInt(ligne[1]);
            return Fq;
        }
    2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static String ExtraireGramChaine(String chaine) {
     
            String[] ligne = chaine.split(":");
            String Gm = ligne[0].toLowerCase();
             return Gm;
        }
    3:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static void ChercherChaineFichier(BufferedReader fichier, ArrayList<String> mot) throws IOException {
     
        while(fichier.readLine()!= null)
        { String ch1= ExtraireGramChaine(fichier.readLine());
        Iterator<String> it= mot.iterator();
        while (it.hasNext())
        {String ch2= it.next();
        if (ch1.compareTo(ch2) == 0)
         System.out.println(ch1+"="+ExtraireFreqChaine(fichier.readLine()));
        else System.out.println(ch1+"="+0);
        }
     
        }}
    Au niveau main j'appelle ma fonction 3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ChercherChaineFichier(AccésAuFichier("monfichier.txt"), l);
    selon monfichier le resultat attendu :
    _bo=30
    bon=2
    ons=0
    nso=0
    soi=0
    oir=0
    ir_=0
    alors que mon programme affiche ça:
    Nom : Capture.PNG
Affichages : 268
Taille : 1,7 Ko

    Je pense que mon problème réside au niveau des boucles.Aussi les fréquence extraits du fichier sont décalées par une ligne à partir du monfichier.txt :
    Nom : fi.PNG
Affichages : 274
Taille : 1,7 Ko

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu ne dosi avoir qu'un appel à readLine par boucle, pas plus. A chaque fois que tu appelle readLine, tu fais avancer le fichier. Dans ton code, il y a 2+N appels à readLine par itération de boucle sur le fichier. Donc oui, forcément ça fait un peu n'importe quoi.

  5. #5
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 181
    Par défaut
    Oui vous avez raison , j'ai évité l'appel à readLine () , le souci du décalage est éliminé sauf que, encore il y a une répétition au niveau de l'affichage


    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
    public static void ChercherChaineFichier(BufferedReader fichier, ArrayList<String> mot) throws IOException {
             String ch=null;
             while (( ch=fichier.readLine()) != null) {
             String ch1 = ExtraireGramChaine(ch);
              Iterator<String> it = mot.iterator();
              while (it.hasNext()) {
                    String ch2 = it.next();
                    if (ch1.compareTo(ch2) == 0) {
                        System.out.println(ch1 + "=" + ExtraireFreqChaine(ch));
                    } else {
                        System.out.println(ch1 + "=" + 0);
                    }
                }
     
            }
        }

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    forcément puisque tu as une boucle sur tous les mots de ton ArrayList, et que tu affiches quelque chose à chaque boucle.
    Ca veut donc dire que pour chaque ligne du fichier, tu vas afficher autant de lignes qu'il y a de mots dans l'ArrayList.

    Forcément ça ne va pas. Il faudrait que ce ne soit pas une boucle, ou alors que tu n'affiches pas des choses à chaque boucle.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/05/2012, 01h19
  2. Réponses: 3
    Dernier message: 29/05/2009, 14h59
  3. Réponses: 6
    Dernier message: 15/05/2008, 15h20
  4. Comparaison de chaine dans la clause WHERE
    Par oceanbigone dans le forum Requêtes
    Réponses: 3
    Dernier message: 31/07/2006, 09h28
  5. comparaison entre chaines de caracteres
    Par Mpierre dans le forum Oracle
    Réponses: 2
    Dernier message: 22/06/2006, 23h21

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