Hola Adrián:
Es correcto lo que dices! Me he confundido yo en mi respuesta anterior:
El ciclo "for (i=0; i < entradaTeclado.length() ; i++) "
asumirá los siguientes valores de "i": 0, 1, 2, y 3 cuando la cadena sea "Hola".
Tienes toda la razón! disculpas por la confusión, se trata de un operador < y no de un operador <=.
Pero vayamos al nudo de nuestro problema y para eso retomemos el código original de la clase, que es el que se publica en la lección:
import java.util.Scanner; //Importación del código de la clase Scanner desde la biblioteca Java
// Definimos una clase EntradaDeTeclado aprenderaprogramar.com
public class EntradaDeTeclado {
private String entradaTeclado; //Variable de instancia (campo) de la clase
public EntradaDeTeclado () { //Constructor
entradaTeclado="";
pedirEntrada(); //Esto es una llamada a un método interno. Al crear un objeto ejecutamos el método
} //Cierre del constructor
public void pedirEntrada () { //Método de la clase
Scanner entradaEscaner = new Scanner (System.in);
entradaTeclado = entradaEscaner.nextLine (); } //Cierre del método pedirEntrada
public String getEntrada () { return entradaTeclado; } //Cierre del método getEntrada
public String getPrimeraPalabra () {
/*IMPORTANTE: EN JAVA LOS OBJETOS NO SE PUEDEN COMPARAR USANDO == POR ESO ESTO NO FUNCIONARÁ
if (entradaTeclado.substring(0,1)=="j") {
System.out.println ("Hemos detectado una j");
} else { System.out.println ("Mira esto:" + entradaTeclado.substring(0,1) ); }*/
for (int i=0; i < entradaTeclado.length() - 1; i++) {
if (entradaTeclado.substring (i, i+1).equals(" ") ) { //IMPORTANTÍSIMO: COMPARAMOS CON EQUALS
return entradaTeclado.substring(0, i+1); }
}
return entradaTeclado; //Caso de que no se detecte ningún espacio devolvemos lo que haya
} //Cierre del método getPrimeraPalabra
public int getLongitud () { //Método de la clase
return entradaTeclado.length();
} //Cierre del método getLongitud
} //Cierre de la clase
Analizaremos primeramente qué sucede cuando ingresamos distintas cadenas por teclado.
Si la cadena ingresada por teclada fuera: "HolaAmigo", revisemos qué sucedería en el ciclo for:
for (int i=0; i < entradaTeclado.length()-1 ; i++) {
if (entradaTeclado.substring (i, i+1).equals(" ") ) {
return entradaTeclado.substring(0, i+1);
}
}
El valor de entradaTeclado.length()-1 sería 8. Es decir que:
entradaTeclado.substring (i, i+1).equals(" ")
devolverá desde la letra "H" hasta la letra "g". Se compararán todas las letras de la cadena ingresada menos la última (lo cual no sería estrictamente lo correcto).
De todos modos, como no hay ningún caracter " ", nunca será true el condicional if, y por lo tanto el retorno se alcanzará en la línea:
return entradaTeclado; //Caso de que no se detecte ningún espacio devolvemos lo que haya
Esta línea nos devuelve la cadena "HolaAmigo".
Fíjate que no podemos darnos cuenta si cuando chequeábamos letra por letra, preguntamos por todas ellas (cosa que no sucedió), ya que lo que se imprime por consola es lo que contiene el campo entradaTeclado, que es "HolaAmigo".
Ahora bien, y qué sucedería si la cadena ingresada fuese "HolaAmigo " (termina en un espacio). Analicemos:
El valor de entradaTeclado.length()-1 sería 9. Es decir que:
entradaTeclado.substring (i, i+1).equals(" ")
devolverá desde la letra "H" hasta la letra "o", y se compararán todas las letras de la cadena ingresada menos el espacio final.
Por lo tanto nunca se alcanzaría a chequear que el último caracter es un espacio. El condicional if nunca sería true, y el retorno se alcanzaría también en la línea:
return entradaTeclado; //Caso de que no se detecte ningún espacio devolvemos lo que haya
y se devuelve la cadena "HolaAmigo ".
Ultimo cadena a analizar: si la cadena ingresada tuviera un caracter " " en una posición intermedia, por ejemplo si la cadena fuese "Hola Amigo".
Cuando "i" sea igual a 4, el condicional if se convierte en true, y el retorno se alcanza ahora en la línea:
return entradaTeclado.substring(0, i+1);
la cadena retornada será: "Hola " (con un espacio luego de la letra "a").
Ahora bien ¿y si modificamos el límite superior del ciclo for codificandolo de la siguiente manera?
for (int i=0; i < entradaTeclado.length(); i++) {
if (entradaTeclado.substring (i, i+1).equals(" ") ) {
return entradaTeclado.substring(0, i+1);
}
}
Primer caso:
Si la cadena ingresada fuese "HolaAmigo", ahora
entradaTeclado.substring (i, i+1).equals(" ")
devolverá desde la letra "H" hasta la letra "o". Se compararán todas las letras de la cadena ingresada (lo cual sería lo correcto!).
No hay ningún caracter " ", nunca será true el condicional if, y por lo tanto el retorno se alcanzará en la línea:
return entradaTeclado; //Caso de que no se detecte ningún espacio devolvemos lo que haya
Esta línea nos devuelve la cadena "HolaAmigo".
Segundo caso:
Si la cadena ingresada fuese "HolaAmigo " (con un espacio al final)
entradaTeclado.substring (i, i+1).equals(" ")
devolverá desde la letra "H" hasta el espacio final. El caracter final " ", haría que el condicional if sea true, y por lo tanto el retorno se alcanzará en la línea:
return entradaTeclado.substring(0, i+1);
Esta línea nos devuelve la cadena "HolaAmigo " (con un espacio al final).
Tercer caso:
Si la cadena ingresada fuese "Hola Amigo" (con espacio intermedio), sucedería lo mismo que ya se analizó.
Conclusión:
Si nos guiamos por los resultados que vemos en la consola, es exactamente igual si ese -1 lo incluímos o no en el límite superior del ciclo for. Pero si analizamos el desarrollo de lo que sucede internamente en el código hay diferencias.
En mi opinión personal, yo sacaría el -1 del límite superior del ciclo for. De esa manera internamente sea chequearían cada una de las letras de la cadena ingresada.