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

  1. #1
    Membre du Club
    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
    Points : 64
    Points
    64
    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 sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    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 du Club
    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
    Points : 64
    Points
    64
    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 : 246
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 : 249
Taille : 1,7 Ko

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    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 du Club
    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
    Points : 64
    Points
    64
    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 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    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

  7. #7
    Membre du Club
    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
    Points : 64
    Points
    64
    Par défaut
    Pas encore résolu

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

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Je ne vois pas ce qui a changé ?

    Tu fais toujours des trucs à chaque boucle...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre du Club
    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
    Points : 64
    Points
    64
    Par défaut
    Bonjour,

    La structure de mon fichier (mot:fréquence). Ci-dessous une capture de mon fichier de test:
    Nom : 1.PNG
Affichages : 240
Taille : 1,6 Ko

    J'ai effectué quelques changements au niveau de mon programme , les voilas :
    Ces deux fonctions , l'une cherche si l'un mot donné exisite dans le fichier , dans ce cas retourne sa fréquence (à partir du fichier).

    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
     public static int trouveMotFile(BufferedReader fichier, String mot) throws IOException {
            String line = null;
            boolean trouve = false;
            int x = 0;
            while (((line = fichier.readLine()) != null) && (!trouve)) {
                String[] ligne1 = line.split(":");
                int Fq = Integer.parseInt(ligne1[1]);
                String Gm = ligne1[0].toLowerCase();
                if (Gm.equals(mot)) {
                    trouve = true;
                    x = Fq;
                }
            }
            return x;
        }
    La deuxième prend toute une liste de mots , et à chaque fois elle appelle la première fonction afin de trouver le mot. les resultats (mot trouvé = fréqunece) seront stockés dans un Map.

    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
     public static Map<String, Integer> ChercherChaineFichier(BufferedReader fichier, ArrayList<String> listeMots) throws IOException {
     
            Map<String, Integer> frequences = new HashMap<String, Integer>();
            int freq = 0;
            Iterator<String> it = listeMots.iterator();
            while (it.hasNext()) {
                String s = it.next();
                freq = trouveMotFile(fichier, s);
                frequences.put(s, freq);
            }
     
            for(Map.Entry<String,Integer> e : frequences.entrySet())
            {System.out.println(e.getKey() + " = " + e.getValue());}
            return frequences;
        }


    Les résultats appercus : pour une liste donnée : _bo | bon | onj | njo | jou | our |ur_
    Nom : 22.PNG
Affichages : 253
Taille : 1,3 Ko

    Les résultats attendus

    bon =2
    jou = 6
    njo = 8
    ur_ = 1
    onj = 15
    _bo = 30
    our = 5

    aidez moi à resoudre ce problème
    Merci.

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ton problème est que tu passes la même instance de BufferedReader à ta méthode trouveMotFile() : quand le flux est consommé, il n'y a plus rien à lire dedans. Il faudrait recréer un nouveau BufferedReader à chaque fois que tu appelles trouveMotFile(). Ce qui va faire que tu vas lire autant fois le fichier qu'il y a de mots... Il vaudrait mieux le lire qu'une seule fois, en le chargeant par exemple dans une liste (avec Files.readAllLines()) et passer cette liste au lieu du BufferedReader). Ou alors mettre les mots dans un Set, parcourir les lignes du BufferedReader, et pour chaque mot lu, regarder s'il se trouve dans le set (set.contains( line[0].toLowerCase() ), et si c'est le cas stocker le mot avec sa fréquence.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  11. #11
    Membre du Club
    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
    Points : 64
    Points
    64
    Par défaut
    Merci pour vos efforts

    En fait, mon problème est résolu quand j'ai changé le mode de la lecture à partir du fichier. J'ai passer de fichier.readLine() à utiliser Scanner.

    ça donne un resultat correcte


    Merci pour tout le mode

+ 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