Partage
  • Partager sur Facebook
  • Partager sur Twitter

Compter le nombre d'ocurrence d'un mot dans un texte

Bug incompréhensible ^^

    14 mai 2009 à 23:54:29

    Bonjour tout le monde, en cours nous devions coder un programme permettant de compter le nombre de récurrence d'un mot dans un fichier texte. Voici les différentes classes :

    public class Element {
    
    	private String mot;
    
    	private int nbOcc;
    
    
    
    	public Element(String mot) {
    
    
    
    		this.mot = new String(mot);
    
    		nbOcc=1;
    
    	}
    
    
    
    	public String getMot() {
    
    		return mot;
    
    	}
    
    	public void setMot(String mot) {
    
    		this.mot = mot;
    
    	}
    
    	public int getNbOcc() {
    
    		return nbOcc;
    
    	}
    
    	public void setNbOcc(int nbOcc) {
    
    		this.nbOcc = nbOcc;
    
    	}
    
    
    
    	public boolean equals(String unMot){
    
    		return mot.equals(unMot);
    
    	}
    
    
    
    	public void inc(){
    
    		nbOcc++;
    
    	}
    
    	public void afficher(){
    
    		System.out.println ("<-"+mot+" "+nbOcc+"->");
    
    	}
    
    
    
    }
    


    public class ListeC {
    
    	int queue;
    
    	int max;
    
    	Element[] tab;
    
    	public ListeC(){
    
    		max=1000000;
    
    		tab= new Element[max];
    
    		queue=-1;
    
    	}
    
    	public void adjq(Element v){
    
    		tab[queue+1]=v;
    
    		queue=queue+1;
    
    	}
    
    	public void supq(){
    
    		queue=queue-1;
    
    	}
    
    	public void afficher(){
    
    		for(int i=0; i<queue+1; i++){
    
    			tab[i].afficher();
    
    		}
    
    	}
    
    	
    
    	public void ajouter (String mot){
    
    		int p=0;
    
    		boolean trouve = false;
    
    		while (p<=queue && !trouve){
    
    			if (tab[p].equals(mot)){
    
    				trouve=true;
    
    			}
    
    			else{
    
    				p=p+1;
    
    			}
    
    		}
    
    		if (trouve) {
    
    			tab[p].inc();
    
    		}
    
    		else {
    
    			adjq(new Element(mot));
    
    		}
    
    
    
    	}
    
    
    
    }
    


    import java.io.File;
    
    import java.io.FileNotFoundException;
    
    import java.util.Scanner;
    
    import java.util.StringTokenizer;
    
    
    
    import javax.swing.JFileChooser;
    
    
    
    
    
    public class tester {
    
    //	static char [] aremplacer={ '(', ')',',',';','?','\''}; // les caractères a remplacer
    
    //	par des blancs
    
    	public static void main(String [] t){
    
    		lirefichier();
    
    
    
    	}
    
    	public static void lirefichier(){
    
    		ListeC l = new ListeC();
    
    		try {
    
    			
    
    			JFileChooser dialogue = new JFileChooser("."); // on ouvrira dans le 
    
    //			répertoire courant par défaut
    
    //			ou sinon 
    
    //			dialogue.setCurrentDirectory(new File("."));
    
    
    
    			File fichier;
    
    
    
    			if (dialogue.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
    
    			{ // on a cliqué OK
    
    			fichier = dialogue.getSelectedFile();
    
    
    
    			}
    
    			else{
    
    //			 on a cliqué Cancel
    
    			fichier = new File("exemple"); //attention si le fichier n'existe pas !!
    
    			}
    
    
    
    			Scanner sc = new Scanner(fichier);
    
    
    
    			while (sc.hasNext())
    
    			{
    
    				String uneligne = sc.nextLine();
    
    //				On rempace les caracteres un par un
    
    //				for (int i =0; i<aremplacer.length;i++){
    
    //				uneligne=uneligne.replace(aremplacer[i],' ');
    
    //				}
    
    
    
    				StringTokenizer st = new StringTokenizer(uneligne);
    
    				while (st.hasMoreTokens())
    
    				{
    
    					l.ajouter(st.nextToken());
    
    				}
    
    			} 
    
    		} catch (FileNotFoundException e) { 
    
    			System.out.println("pas de fichier");
    
    			e.printStackTrace();
    
    		}
    
    		l.afficher();
    
    
    
    
    
    	}
    
    }
    


    Bon alors, j'explique le bug, je lance le ficher "tester". Le navigateur me permettant de choisir le fichier texte que je veux analyser s'ouvre, je sélectionne un fichier .txt existant. Et là si j'ai de la chance cela fonctionne, le programme m'indique que le texte contient : 17 fois le mot "le", 53 fois le mot "siteduzéro". ^^
    Et si, j'ai pas de chance, en faite dès que je fais un copier coller d'un texte vers le fichier .txt, Eclipse ne veut plus rien m'afficher, je peux simplement lire au dessus de la console :
    <arrêté> tester [Application Java] /usr/bin/java (14 mai 09 23:52:05)

    Voili, voilou, alors que sur les PC de mon école, ce code fonctionne parfaitement bien.
    Si quelqu'un à une explication et surtout une solution, je suis prenneur ! :D

    Merci de m'avoir lu. ;)

    Et merci pour votre aide future aussi ! :p
    • Partager sur Facebook
    • Partager sur Twitter
      15 mai 2009 à 0:36:29

      Je me suis amusé à remettre ton code en condensé parce que tu sautes beaucoup trop de lignes...
      Enfin bon je viens de lire ton code : lireFichier() place chaque mot du fichier dans une Liste chaînée et tu demandes à afficher la liste, ce qui se fait très bien chez moi.
      Où est le problème ?
      • Partager sur Facebook
      • Partager sur Twitter
        15 mai 2009 à 12:47:35

        Ben voilà, le problème chez moi, c'est que cela ne marche pas tout le temps.

        Dans mon fichier texte, je vais écrire quelque chose moi même cela va fonctionner. Mais si je vais un copier coller d'un texte. Cela ne va pas marcher et le compilateur me retourne :

        <arrêté> tester [Application Java] /usr/bin/java (14 mai 09 23:52:05)
        • Partager sur Facebook
        • Partager sur Twitter
          15 mai 2009 à 13:02:13

          Il ne lance aucune exception ton programme quand ça t'arrive?
          • Partager sur Facebook
          • Partager sur Twitter
            15 mai 2009 à 16:40:25

            Malgré un effort certain, il y a plein de problèmes dans ton code.

            La classe Element manque totalement de logique. On peut setter un mot différent et ça ne change pas automatiquement le nombre d'occurrence, or ça devrait mettre ce nombre à -1 pour dire "non définit". Pourquoi dans le constructeur, on met le nombre d'occurrence à 1 ? Mystère, on sait par avance qu'il n'y a qu'une seule occurrence ? Non, donc ce code est faut puisqu'il permet à une instance d'Element d'être dans un état inconsistant.

            Pour passer à la classe ListeC :
            max=1000000;
            tab= new Element[max];
            


            OMG ! Mais quelle est cette hérésie. Il existe des classe super bien faites qui font tout bien et qui optimise la mémoire, et toi, tu créé un tableau de 1000 000 d'éléments...
            Va voir du coté des listes (ArrayList par exemple), tu n'auras pas besoin de faire des allocation de FOU, la gestion du dernier élément sera également automatique, l'ajout supression sera déjà implémenté, etc.
            Pour faire bref, tu as essayé de refaire une classe qui existe déjà en beaucoup plus optimisé de tous les points de vues (mémoire, rapidité, fonctionnalités, etc.)

            Pour la dernière classe, je n'ai pas le temps de lire, mais corrige déjà les deux première, ce sera un bon début.
            • Partager sur Facebook
            • Partager sur Twitter
              17 mai 2009 à 14:10:54

              Je sais que mon code n'est peut être pas parfait. Mais, à vrai dire, ce n'est pas vraiment mon problème.

              Moi, j'aimerais juste comprendre pourquoi lorsque je l'exécute, il ne compile pas correctement avec tous les textes que je choisis.

              Merci pour votre aide. ;)
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                18 mai 2009 à 9:55:58

                Evidemment, si tu lui demande de compter le nombre de "récurrences" d'un mot, ca ne peut pas fonctionner, vu qu'on dit "occurences"...


                Oki, je sors...
                • Partager sur Facebook
                • Partager sur Twitter
                  18 mai 2009 à 10:24:10

                  Han dommage que je n'ai plus l'exercice que l'on avait fait à se sujet, je pense que il faut découper toutes la phrase avec la méthode split (" ") pour récupérer un tableau de mots, intialiser un tableau d'entier qui contiendra le nombre d'occurences pour chaque mots, et incrémenter chaque fois la case du tableau correspondante ou mot à chaque fois que l'on rencontre ce mot dans le tableau de mot, je pense que j'avais fait pareil mais avec des caractères.
                  Le problème c'est toujours les l' et les d', enfin il y a moyen surement de découper une chaîne en fonction de plusieurs caractères, mais je ne sais pas comment on fait, je ne l'ai jamais fait cherche un peu suis sûr que tu vas trouver.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 mai 2009 à 12:48:40

                    Contenu du fichier texte :
                    Je suis une phrase qui se fait triturer correctement par le programme.

                    C:\Documents and Settings\Moi>java Tester
                    <-Je 1->
                    <-suis 1->
                    <-une 1->
                    <-phrase 1->
                    <-qui 1->
                    <-se 1->
                    <-fait 1->
                    <-triturer 1->
                    <-correctement 1->
                    <-par 1->
                    <-le 1->
                    <-programme. 1->


                    Mais où est ton problème ? Le programme fait exactement ce que je lui demande de faire. Pour compter les occurences d'un mot tu peux déclarer une variable compteur à incrémenter à chaque fois que tu trouves le mot choisi...
                    La méthode String.split() prend une regex en argument, donc c'est toi qui définit le délimiteur à utiliser pour séparer ta chaîne.

                    Tu codes avec Eclipse ?
                    Alors vérifie que tu utilises bien la dernière version officielle du JDK.
                    Essaie de compiler et d'exécuter ton code à la console.

                    Citation : toi

                    Moi, j'aimerais juste comprendre pourquoi lorsque je l'exécute, il ne compile pas correctement avec tous les textes que je choisis.


                    Y'a un soucis dans cette phrase. Tu arrives à compiler ton programme sans erreur ? Ou c'est lors de l'exécution que ça plante ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 mai 2009 à 19:09:53

                      @ evolite : j'ai modifié. ;)

                      Sinon, je vais vous montrer vraiment mon problème, le mieux que je puisse le faire avec deux exemples, un qui fonctionne l'autre pas.

                      Alors c'est bon ?


                      Image utilisateur

                      Mais où est ton problème ? Le programme fait exactement ce que je lui demande de faire. Pour compter les occurences d'un mot tu peux déclarer une variable compteur à incrémenter à chaque fois que tu trouves le mot choisi...
                      La méthode String.split() prend une regex en argument, donc c'est toi qui définit le délimiteur à utiliser pour séparer ta chaîne.


                      Image utilisateur

                      Comme vous pouvez le constater, il n'y a pas vraiment de logique lorsque ça marche ou pas...

                      Pis sinon, je ne sais pas vraiment voir si j'utilise bien la dernier version du JDK, j'ai posté un topic sur ubuntu.fr, pour qu'on m'aide, mais en vain pour le moment.

                      Bref, je désespère de plus en plus. :(

                      Merci pour votre aide.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 mai 2009 à 19:55:01

                        Ah t'es sous Ubuntu ?
                        Dans ce cas télécharge absolument la version officielle sur le site de Sun, car je ne compte plus les topics à problèmes vraiment bizarres provenant du JDK foireux par défaut sous Ubuntu.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 mai 2009 à 20:52:07

                          Est-ce que tu peux me guider dans le téléchargement du JDK ?

                          Car en faite, j'ai déjà télécharger le le sun-java6-jdk par l'intermédiaire de Ubuntu.fr. Mais visiblement c'est pas top. :euh:
                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 mai 2009 à 21:09:44

                            Non je ne peux pas te guider parce que je n'utilise pas Linux.
                            Mais c'est simple tu vas sur le site de Sun c'est pas compliqué, tu peux même suivre la marche sur le tuto de ce site.
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              21 mai 2009 à 13:50:31

                              Sinon, tu cherches JDK dans synaptic, et tu prends le plus récent...
                              • Partager sur Facebook
                              • Partager sur Twitter
                                29 mai 2009 à 11:50:36

                                public void adjq(Element v){
                                		tab[queue+1]=v;
                                		queue=queue+1;
                                	}
                                

                                et tout ça parce que queue est initialisée à -1 :p

                                alors que queue = 0; puis
                                public void adjq(Element v){
                                		tab[queue] = v;
                                		queue++;
                                	}
                                

                                ça marche tout autant :D

                                bon j'arrête de charrier ^^
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Compter le nombre d'ocurrence d'un mot dans un texte

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown