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
atemp.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óni == -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í.