Problème d'affichage

Bonjour,

J'ai besoin de déterminer un palindrome sans tenir compte des espaces/virgules/deux-points.
Je ne sais pas où se situe mon erreur ici (voir fin).

 public static void main(String []args) {
  String ch;
  Scanner s = new Scanner(System.in);
  System.out.print("Palindrome ?");
  ch= s.nextLine();
  
  int i=0, j=ch.length()-1;
  while (i!=j) {
   while (ch.charAt(i)==' ' || ch.charAt(i)==',' || ch.charAt(i)==':')
    i++;
   while (ch.charAt(j)==' ' || ch.charAt(j)==',' || ch.charAt(j)==':')
    j--;
   if (ch.charAt(i)==ch.charAt(j)) {
    i++;
    j--;
    if (i==j) {
     System.out.println(true);
     break;
    }
   } else {
    System.out.println(false);
    break;
   }
  }
 }


Palindrome ?TU L AS TROP ECRASE CESAR CE PORT SALUT
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 39
at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:47)
at java.base/java.lang.String.charAt(String.java:693)
at TD4_ex5.main(TD4_ex5.java:28)

2 réponses

  1. Modérateur
    Bonjour,

    La condition d'arrêt de ta boucle c'est de tomber sur le caractère du milieu (i == j).
    Mais cela ne peut fonctionner qu'avec un nombre impair de caractères.
    Or ta saisie as un nombre pair de caractères, donc il n'y a pas de caractère de milieu, du coup ta boucle ne s'arrêtes pas et ça fait n'importe quoi.
    1. Mais lorsque je rajoute ma condition au début de la boucle,
      if (ch.length()%2==0) {
      				System.out.println(false);
      				break;
      			}
      

      j'ai "false" comme résultat quand je rentre "TU L AS TROP ECRASE CESAR CE PORT SALUT" et l'erreur précédente en cas de "A MAN, A PLAN, A CANAL : PANAMA"
  2. Bonjour,

    Le distributeur automatique de réponses est en panne....
    Donnez-vous au moins la peine de poser une question, en faisant une phrase !