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 :

Comportement étrange d'un .equals


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 40
    Par défaut Comportement étrange d'un .equals
    Bonjour a tous et à toute !

    Je viens vers vous car je cherche à développer un petit jeu en java et je me retrouve avec un comportement vraiment étrange... ou alors je passe à côté de quelques chose ^^

    Je vous explique, j'ai une méthode qui évalue une réponse passé en paramètre avec une liste de mot clef...
    J'ai choisit un HashSet pour l'ensemble contenant les mot clef mais n'étant qu'une débutante il se peut que ce choix ne soit aucunement justifié.

    Ceci dit voici la méthode (bien plus parlant) :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    /* Methode qui test si la phrase passé en paramétre comporte des correspondances avec les mots contenu dans le tableau de la class */
    	private boolean testMotClef(String rep){
     
    		int tot = 0;							// nb de mot clef trouvé das la réponse fournit par l'utilisateur
     
    		int debut = -1;
    		int fin = -1;
    		int dernier_espace = 0;
    		Pattern p = Pattern.compile(" ");
    		Matcher m = p.matcher(rep);
    		boolean existe = false;
     
    		// lancement de la recherche
    		while(m.find()) {
    			if ( !existe )
    			{
     
    				if  ( debut != -1 && dernier_espace == 0 )								// Si une position est enregistré c'est que nous sommes dans le second passage et +
    				{
    					// j'ai la position de fin et de debut du mot
    					String mot = rep.substring(debut, m.start()+1);
    					debut = m.start()+1;								// debut du mot suivant dans la réponse fournit par l'utilisateur
     
    					// Le mot trouvé est il présent dans le tableau de mot clef?
    					Iterator<String> it = mot_clef.iterator();			// iterateur pour parcourir le hashSet
     
    					// on parcours l'ensemble
    					while ( it.hasNext() )
    					{
    						String o = (String) it.next();
    						System.out.println("o : "+o);
    						System.out.println("mot : "+mot);
    						if ( mot.equalsIgnoreCase(o) )							// Si les deux mots concordent
    						{
    							System.out.println("Le mot correspond :"+o);
    							// On a trouvé un mot
    							tot += 1;
    							// Le nb de mot clef est il atteind?
    							if ( tot >= this.nb_mc){
    								// Si ca correspond c'est gagné
    								existe = true;
    								System.out.println(nb_mc+" occurence ont était trouvé ! c'est gagné...");
    								break;
    							}
    						}
    					} 
    					if ( rep.lastIndexOf(" ") == m.start() ){
    						dernier_espace = 1;
    					}
    ------------------------------------------------------
    				}else if  ( debut == -1 )			// On est au premier espace de la phrase	 => 	fin du premier mot
    				{	
    					// on peut tester de 0 a debut pour recuperer le premier mot
    					fin = m.start()+1;
    					debut = m.start()+1;				// début du second mot de la réponse fournit
     
    					// On récupère le mot
    					String mot = rep.substring(0, fin);
     
    					// Le mot trouvé est il présent dans le tableau de mot clef?
    					Iterator<String> it = mot_clef.iterator();				// iterateur pour parcourir le hashSet
    					while ( it.hasNext() )									// Pour chaque éléments de l'ensemble
    					{
    						String o = (String) it.next();						// o reçoit les mot clef les un aprés les autres
    						System.out.println("o : "+o);
    						System.out.println("mot : "+mot);
    						System.out.println(o.equalsIgnoreCase(mot));
    						if ( o.equals(mot) )								// et teste leurs concordance avec le mot extrait de la réponse
    						{
    							System.out.println("Le mot correspond :"+o);
    							tot += 1;										// On incremente le tot de correspondance
    						}
    					}
    					// ------------------------------------------------------
    				}
    				if ( dernier_espace == 1 )							// Il s'agit du dernier mot contenu dans la réponse de l'utilisateur
    				{
    					// je connait la position de fin => la longueur de la phrase
    					fin = rep.length();
     
    					String mot = rep.substring(m.start()+1, fin ); 				// de l'espace +1 jusqu'a la fin
    					// Le mot trouvé est il présent dans le tableau de mot clef?
    					Iterator<String> it = mot_clef.iterator();			// iterateur pour parcourir le hashSet
    					while ( it.hasNext() )
    					{
    						String o = (String) it.next();
    						if ( o.equals(mot) )							// Si les deux mots concordent
    						{
    							System.out.println("Le mot correspond :"+o);
    							// On a trouvé un mot
    							tot += 1;
    							System.out.println("il y a "+tot+" correspondance trouvé a ce stade");
    							// Le nb de mot clef est il atteind?
    							if ( tot >= this.nb_mc){
    								// Si ca correspond c'est gagné
    								existe = true;
    								System.out.println(nb_mc+" occurence ont était trouvé ! c'est gagné...");
    							}
    						}
    					}
    				}
    			}
    		}
     
    		return existe;
    	}
    Je suis désolé si c'est un peu lourd... mais je tenais à tout vous montrer afin que vous compreniez bien le problème.

    En effet grâce aux 'alert' je voit bien que les correspondances sont trouvé mais equals renvoie false dans tous les cas sauf le dernier

    voici le débogage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // constructeur + ajout des mot clef à l'ensemble
    ...
    carteJeu1.lireQuestion();
    carteJeu1.lireReponse();
    carteJeu1.evaluerReponse("Sarkozy s'apelle Carla Bruni");
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    Comment s'appelle la femme du président de la France?
    Carla Bruni Sarkozy
     
    Le premier mot est :Sarkozy 
    o : sarkozy
    mot : Sarkozy 
    false
     
    o : carla
    mot : Sarkozy 
    false
     
    o : Sarkozy
    mot : Sarkozy 
    false
     
    o : bruni
    mot : Sarkozy 
    false
     
    o : Bruni
    mot : Sarkozy 
    false
     
    o : Carla
    mot : Sarkozy 
    false
     
    o : sarkozy
    mot : s'apelle 
    o : carla
    mot : s'apelle 
    o : Sarkozy
    mot : s'apelle 
    o : bruni
    mot : s'apelle 
    o : Bruni
    mot : s'apelle 
    o : Carla
    mot : s'apelle 
     
    o : sarkozy
    mot : Carla 
    o : carla
    mot : Carla 
    o : Sarkozy
    mot : Carla 
    o : bruni
    mot : Carla 
    o : Bruni
    mot : Carla 
    o : Carla
    mot : Carla 
    Le mot correspond :Bruni
    il y a 1 correspondance trouvé a ce stade
    Voila j’espère avoir été clair... mais en gros ma question est ^^ pourquoi le equals renvoie false alors que la correspondance existe?

  2. #2
    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
    Bon... J'ai pas l'énergie pour parler de tout ce qui ne va pas là-dedans. Et du coup, j'admets que sans améliorer tout ça, c'est difficile de montrer un programme plus court quand on ne sait pas d'où vient le problème.

    Parlons seulement du problème qui t'intéresse :
    Mets des [] autour des mots que tu débugues. Comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("mot : [" + mot + "]");
    Ça devrait te donner ta réponse.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 119
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Bon... J'ai pas l'énergie pour parler de tout ce qui ne va pas là-dedans.
    Allez, on va dire que moi je l'ai .

    Pour simplifier ton code, utilise la méthode "contains(String s)" de la classe String...
    Du coup ta fonction se simplifie en :
    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
     
       private boolean testMotClef(String rep){
     
            int tot = 0;// nb de mots clef trouvés dans la réponse fournie par l'utilisateur
            Iterator<String> it = mot_clef.iterator();// iterateur pour parcourir le hashSet
     
            // on parcours l'ensemble des mots clés
            while ( it.hasNext() )
                if ( rep.contains(it.next()) )    // Si la réponse contient le mot clé 
                {                        
                    tot++ ;
                    // Le nb de mot clef est il atteint?
                    if ( tot >= this.nb_mc)
                        return true ; 
                }       
            //Si on arrive là, c'est que le nombre de mots clés n'a pas été atteint
            return false;
        }
    Et en ajoutant un peu de "toLowerCase()", tu peux ignorer la casse...

    Et autre "problème" de ton code : le passage par la variable "existe" avec des break n'est pas nécessaire (c'est même caca), des return true / return false aux bons endroits c'est tellement mieux !

    Voilà voilà donc pour résumer tu t'es (beaucoup) emmerdée pour pas grand chose ... la dure loi d'être débutante

    A+

  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
    Je rajoute les conseils suivants:
    pour couper une chaîne de caractères autour d'une séquence de caractères, utilisez

    String[] elements = machaine.split(expression).

    Donc dans votre cas
    String mots = phrase.split(" ");

    Ensuite, pour trouver un élément dans un hashset, inutile de le parcourir, utilisez sa méthode "contains". A noter que ce n'est pas utilisable pour "equalsIgnoreCase". Si vous voulez un comportement spécifique, englobez vos String dans un objet personnalisé. Exemple optimisable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class MaString{
        private final String contenu;
        public MaString(String contenu){this.contenu=contenu;}
        public boolean equals (Object o) {
            return (o instanceof MaString) && ((MaString)o).contenu.equalsIgnoreCase(contenu);
        }
        public int hashCode(){return contenu.toUpperCase().hashCode();}
    }

  5. #5
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 40
    Par défaut merci !!!
    Bonsoir,

    Un grand merci à vous tous pour vos réponse !

    Je me rend compte quand je code que je me complique la vie mais je ne voyait pas comment procéder autrement.
    Là j'ai de quoi faire !
    Je vais appliquer tous vos conseils et sachez que je vous suis vraiment très reconnaissante de toutes ses explications claire et complète.

    Je croit que mon problème est résolu

    Amicalement.
    Cleecky

  6. #6
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 119
    Par défaut
    Citation Envoyé par cleecky Voir le message
    Je me rend compte quand je code que je me complique la vie
    Comme je disais... la dure loi du débutant .

    Content d't'avoir aidée.

    A+

  7. #7
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 40
    Par défaut
    Re !

    J'ai mis en pratique vos solutions, Mopmop ta solution marche parfaitement bien ! C'est quand même un peu frustrant de voir ce petit bout de code marcher à la perfection quand je vois le temps que j'ai passé pour réussir à tester tous les mots avec ma technique foireuse...

    Ceci dit je suis très contente d'avoir découvert cette méthode .contains() qui va me permettre de simplifier tout mon code et j’espère de gagner du temps pour la suite de mes développements.

    tchize_ je te remercie aussi pour la piste de l'objet personnalisé je ne sait pas trop si je vais oser me lancer dedans...
    Si choisit de créer une classe MaString pour englober mes String j'imagine que je serai dans l'obligation de la modéliser dans mon diagramme UML?!?

    En tout cas encore Merci et bonne continuation à tous !

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

Discussions similaires

  1. [Forms6i] Un IF-ELSIF au comportement étrange
    Par lafouine dans le forum Forms
    Réponses: 11
    Dernier message: 13/09/2005, 15h40
  2. Comportement étrange apres une désinstallation
    Par Sunchaser dans le forum Excel
    Réponses: 4
    Dernier message: 06/08/2005, 19h44
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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