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

avec Java Discussion :

Problème dans la méthode indexOf()?


Sujet :

avec Java

  1. #1
    Membre régulier Avatar de menoulette
    Inscrit en
    Août 2009
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 320
    Points : 111
    Points
    111
    Par défaut Problème dans la méthode indexOf()?
    Bonsoir à vous tous

    J'ai un petit tp à réaliser il s'agit d'établir un programme qui peut compter le nombre d'occurence d'un mot dans une chaine de caractère ..mais là je n'arrive pas à comprendre comment que la méthode indexOf() fonctionne c'est pour ca que j'ai un problème avec ce programme qui n'affiche pas le resultat juste ..quelqu'un pourra m'aider à trouver le problème et m'expliquer comment cette dernière fonctionne merci d'avance le voici 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
     
     
     
    import javax.swing.JOptionPane;
     
    public class Occurence {
    public static int NbrFois(String chaine,String mot){
    	int cmpt=0;int i=0;
    	while(i<chaine.length())
     
    		{
    		if (chaine.indexOf(mot, i)!=-1){
    		cmpt++;
    		}
    		i=i + (mot.length());
     
    		chaine=chaine.substring(i);
     
    		}
     
    	return cmpt;
    }
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		 String chaine= JOptionPane.showInputDialog(null,"donner votre phrase");if (chaine==null) JOptionPane.showMessageDialog(null,"la chaine est vide");
    		 String mot= JOptionPane.showInputDialog(null,"donner le mot à rechercher");if (mot==null)JOptionPane.showMessageDialog(null,"la chaine est vide");
    		int nbre=NbrFois(chaine,mot);
    		if(nbre!=0)
    		JOptionPane.showMessageDialog(null,"Le mot {"+mot+"} apparait "+ nbre+" fois");else JOptionPane.showMessageDialog(null,"le mot n'apparait pas dans la phrase");
     
     
     
    	}
     
    }
    Merci

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    			i = i + (mot.length());
     
    			chaine = chaine.substring(i);
    D'un coté tu incrémentes l'index, de l'autre tu tronques la chaine. Forcément à un moment c'est plus bon...

    Tu n'as pas besoin de tronquer la chaine puisque tu gère déjà proprement l'index...


    a++

  3. #3
    Membre régulier Avatar de menoulette
    Inscrit en
    Août 2009
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 320
    Points : 111
    Points
    111
    Par défaut
    Salut merci pour votre réponse mais le programme toujours ne calcule pas juste

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Ah...

    Je n'avais pas vu que tu ne récupérais pas l'index trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (( i = chaine.indexOf(mot, i) )!= -1) {
    a++

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 328
    Points : 459
    Points
    459
    Par défaut
    Bonjour,

    Ou alors:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while(i<chaine.length()){
                i = chaine.indexOf(mot);
                if(i != -1)
                //if(chaine.indexOf(mot, i)!=-1)
                {
                   cmpt++;
                   chaine=chaine.substring(i + (mot.length()));
                }
                //i=i + (mot.length());
     
                //chaine=chaine.substring(i);
     
             }
    Cordialement,

    Dan

  6. #6
    Membre régulier Avatar de menoulette
    Inscrit en
    Août 2009
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 320
    Points : 111
    Points
    111
    Par défaut
    Re :
    Même avec ce test là et ca ne marche plus ...je sais pas ou se trouve bien le problème

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Redonnes le code exact et les valeurs que tu utilises...

    a++

  8. #8
    Membre régulier Avatar de menoulette
    Inscrit en
    Août 2009
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 320
    Points : 111
    Points
    111
    Par défaut
    Re: Le voici le nouveau 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
     
     
     
    import javax.swing.JOptionPane;
     
    public class Occurence {
    public static int NbrFois(String chaine,String mot){
    	int cmpt=0;int i=0;
    	while(i<chaine.length())
     
    		{
    		if (chaine.indexOf(mot, i)!=-1){
    		cmpt++;
    		}
    		i=i + (mot.length());
     
     
     
    		}
     
    	return cmpt;
    }
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		 String chaine= JOptionPane.showInputDialog(null,"donner votre phrase");if (chaine==null) JOptionPane.showMessageDialog(null,"la chaine est vide");
    		 String mot= JOptionPane.showInputDialog(null,"donner le mot à rechercher");if (mot==null)JOptionPane.showMessageDialog(null,"la chaine est vide");
    		int nbre=NbrFois(chaine,mot);
    		if(nbre!=0)
    		JOptionPane.showMessageDialog(null,"Le mot {"+mot+"} apparait "+ nbre+" fois");else JOptionPane.showMessageDialog(null,"le mot n'apparait pas dans la phrase");
     
     
     
    	}
     
    }


    pour le jeu de test si par exemple je fais entrer cette chaine de caractères :

    aa fff aa ff aaa ff aa fj aa aa ff et je cherche le mot {aa} normalement ca deverait m'afficher le mot aa apparait fois mais il m'affiche le mot aa apparait 15 fois ???Merci

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Tu n'as pas pris en compte ma dernière remarque : http://www.developpez.net/forums/d10...f/#post5985061

    Pour faire simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	public static int NbrFois(String chaine, String mot) {
    		final int len = mot.length();
    		int cmpt = 0;
    		int i =0;
    		while (( i = chaine.indexOf(mot, i) )!= -1) {
    			 i = i + len;
    			cmpt++;
    		}
    		return cmpt;
    	}
    a++

    PS : J'ai l'impression que tu as recopier ce code mais que tu ne le comprend pas... Franchement si c'est bien cela tu pars dans la mauvaise direction. Là ce n'est pas un problème de langage ou autre mais de simple algorithmie, et c'est vraiment la base...

  10. #10
    Membre régulier Avatar de menoulette
    Inscrit en
    Août 2009
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 320
    Points : 111
    Points
    111
    Par défaut
    Citation Envoyé par danimo Voir le message
    Bonjour,

    Ou alors:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while(i<chaine.length()){
                i = chaine.indexOf(mot);
                if(i != -1)
                //if(chaine.indexOf(mot, i)!=-1)
                {
                   cmpt++;
                   chaine=chaine.substring(i + (mot.length()));
                }
                //i=i + (mot.length());
     
                //chaine=chaine.substring(i);
     
             }
    Cordialement,

    Dan
    Ohhh merci beaucoup an ca marche super bien youpiiii merci beaucoup

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 328
    Points : 459
    Points
    459
    Par défaut
    Il y a quand même encore une petite modif (while...) à faire car il ne faut pas que i + la longueur de la sous-chaîne dépasse la longueur de la chaîne:

    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
    //while(i<chaine.length())
             while(i + mot.length() <= chaine.length())
             {
                i = chaine.indexOf(mot);
                if(i != -1)
                //if (( i = chaine.indexOf(mot, i) )!= -1) // ok
     
                //if(chaine.indexOf(mot, i)!=-1) // pas ok
                {
                   cmpt++;
                   chaine=chaine.substring(i + (mot.length()));
                }
                //i=i + (mot.length());
     
                //chaine=chaine.substring(i);
     
             }
     
             return cmpt;
    Et il faut gérer les cas chaînes vides (try/catch) ...

    Dan

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 328
    Points : 459
    Points
    459
    Par défaut
    Désolé mais avec ton exemple de chaine j'ai constaté que mon code n'était pas juste.
    J'ai donc décidé d'utiliser la bonne vieille boucle sans fin qu'on interrompt quand i = -1:

    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
    public static int NbrFois(String chaine,String mot){
             int cmpt=0;int i=0;
     
             boolean encore = true;
             while(encore)
             {
                i = chaine.indexOf(mot);
                if(i != -1)
                {
                   cmpt++;
                   // Le reste de la chaine
                   chaine=chaine.substring(i + (mot.length()));
                }
                else
                   encore = false; // pour sortir de la boucle
             }
             return cmpt;
          }

    Cordialement,

    Dan

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

Discussions similaires

  1. Problème dans une méthode
    Par devhafid dans le forum Général Java
    Réponses: 5
    Dernier message: 25/01/2011, 20h07
  2. Où est le problème dans cette méthode ?
    Par Stéphane Bruckert dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 19/03/2009, 17h00
  3. [Méthode de tri][Arbre binaire] Problème dans l'ordre total
    Par jgavard dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 24/04/2007, 16h55
  4. Réponses: 3
    Dernier message: 14/04/2007, 16h06
  5. problème avec la méthode getElementById() dans Firefox
    Par matrouba dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 19/12/2005, 08h55

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