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:
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 :arf:
voici le débogage :
Code:
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:
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?