Je fais un problème Java CodingBat et j'ai essayé certaines de mes solutions:

boolean doubleX(String str) {
  if (str.length() >= 2){
    for (int i = 0; str.charAt(i) == 'x' && str.charAt(i+1) == 'x'; i++){
      return true;
    }
  }
  return false;
}
boolean doubleX(String str) {
  if (str.length() >= 2){
    for (int i = 0; i < str.length()-1; i++){
      if (str.charAt(i) == 'x' && str.charAt(i+1) == 'x') {
        return true;
      } else {
        return false;
      }
    }
  }
  return false;
}

Ces deux ont produit la même erreur avec ce test

doubleX("axxbb") → true

Mais mon code s'est avéré être false

J'ai également essayé la solution ci-dessous et cela a fonctionné mais je ne comprends pas pourquoi. Quelle est la différence entre les instructions && et if imbriquées?

boolean doubleX(String str) {
    for (int i = 0; i < str.length()-1; i++){
      if (str.charAt(i) == 'x') {
        if (str.charAt(i+1) == 'x') {
          return true;
        } else {
          return false;
        }
      }
    }
  return false;
}

S'il vous plaît, aidez-moi à expliquer. Merci beaucoup d'avance

0
PatientYogurtCloset 17 sept. 2020 à 00:47

2 réponses

Meilleure réponse

Lorsque vous envoyez "axxbb" comme argument dans cette fonction:

boolean doubleX(String str) {
  if (str.length() >= 2){
    for (int i = 0; str.charAt(i) == 'x' && str.charAt(i+1) == 'x'; i++){
      return true;
    }
  }
  return false;
}

Voici ce qui se passe dans la boucle for:

  1. vous initialisez i=0
  2. il vérifie la condition str.charAt(i) == 'x' && str.charAt(i+1) == 'x' - la condition est fausse
  3. la condition est fausse donc elle quitte la boucle

La condition échoue lors de la première vérification, la boucle s'arrête là.

Dans cette fonction:

boolean doubleX(String str) {
  if (str.length() >= 2){
    for (int i = 0; i < str.length()-1; i++){
      if (str.charAt(i) == 'x' && str.charAt(i+1) == 'x') {
        return true;
      } else {
        return false;
      }
    }
  }
  return false;
}

Voici ce que fera la première itération de la boucle for:

  1. vérifier si 'a'=='x' et 'x'=='x' - la condition n'est pas vraie donc elle va directement à l'instruction else pour y exécuter le code
  2. l'instruction else renvoie false et votre fonction s'arrête là

Le problème est que la boucle for ne s'exécute pas plus d'une fois car une fois que la première condition est fausse, elle retournera toujours fausse et ne fera plus d'itérations.

Même la troisième troisième fonction que vous avez fournie ne vous donnera pas un comportement correct lorsque vous envoyez une chaîne comme "axaxx" car une fois que la première condition if (str.charAt(i) == 'x') réussit, la prochaine chose à faire est de vérifier si le caractère suivant est également X. Comme le caractère suivant n'est pas x, il ira à l'instruction else et retournera false.

Ce que vous devez faire pour un comportement correct est d'avoir une condition dans la boucle for qui vérifie si 2 caractères suivants sont x et retourne vrai s'ils le sont. N'ajoutez pas d'instruction else dans la boucle. Si la boucle se termine et que la condition n'a jamais été remplie, vous pouvez retourner false.

0
D. D. 16 sept. 2020 à 22:27

Dans votre premier exemple - la deuxième instruction de votre boucle for définit la condition d'exécution du bloc de code - puisque char 0 et char 1 ne sont pas 'x', il quitte la boucle et renvoie false.

Dans votre deuxième exemple - votre instruction if est dans la boucle, donc la première exécution voit à nouveau que char 0 et char 1 ne sont pas 'x' donc elle retourne false avant l'itération de boucle suivante.

3ème exemple - vous renvoyez correctement false Seulement après avoir confirmé que le premier x trouvé était suivi d'un deuxième x.

0
Michael Royston 16 sept. 2020 à 22:19