java loops for-loop while-loop stringbuilder

Java for loop no termina en mi código



loops for-loop (2)

Por alguna razón, mi bucle for no termina en mi método CapitalizeFirstSentence. Establecí un punto de interrupción en esa línea y la condición (i! = -1) no se ha cumplido, por lo que el bucle debería terminar, ¡pero no lo hace!

Funciona cuando uso (i> 0) para la condición.

No estoy seguro de lo que está pasando aquí.

import javax.swing.JOptionPane; public class SentenceCapitalizer { //Main Method public static void main(String[] args) { String input; //creates a String to hold keyboard input //Prompt the user to enter a String using JOptionPane and set it equal to input input = JOptionPane.showInputDialog("Enter a string. "); //Display the new String with the first letter of each sentenced capitalized JOptionPane.showMessageDialog(null, CapitalizeFirstSentence(input)); //Exit the program System.exit(0); } //Capitalize first letter of each sentence public static String CapitalizeFirstSentence(String in) { //Creates a StringBuilder object initiralized to the String argument "in" StringBuilder temp = new StringBuilder(in); //Capitalize first letter of the string if string length is > 0 if (temp.length() > 0) { temp.setCharAt(0, Character.toUpperCase(temp.charAt(0))); } //sets i equal to index of the space, //keep capitalizing first letters of each sentence (loops each time it capitlizes a letter) //until very end of the String for (int i = temp.indexOf(". ")+1; i != -1; i++) { //Checks for extra spaces and moves index to first character of next sentence while (i < temp.length() && temp.charAt(i) == '' '') { i++; } //Capitalize character temp.setCharAt(i, Character.toUpperCase(temp.charAt(i))); //Index the end of the sentence i = temp.indexOf(". ", i); } //Convert temp to a String and return our new first-sentenced-capitalized String return temp.toString(); } }


En primer lugar, no es una buena idea modificar la variable de control de bucle dentro de un bucle for: es bastante difícil de leer y comprender dicho código, y es propenso a errores.

Ahora, para su ejemplo:

for (int i = temp.indexOf(". ")+1; i != -1; i++)

Esto significa:

  • Inicialice i a temp.indexOf(". ")+1 , que siempre es> = 0
  • Terminar si i == -1
  • Después de cada iteración, incrementa i en 1

Asi que:

  • Al inicio, el ciclo no terminará porque la inicialización siempre devuelve> = 0
  • En cada iteración, el cuerpo del bucle establecerá i = temp.indexOf(". ", i); , que es> = -1
  • Después de cada iteración, se incrementará en 1, por lo que ahora será> = 0
  • Como i siempre es> = 0, nunca cumplirá la condición i == -1 y, por lo tanto, nunca terminará

Esta línea: for (int i = temp.indexOf(". ")+1; i != -1; i++) inicializa i para que sea el resultado de indexOf + 1 . IndexOf da -1 si no hay un hit, pero siempre agrega 1 a eso durante la inicialización, por lo que nunca será menor que 0.

Usar i > 0 parece perfectamente bien allí.