Autor Tema: CU00661B - Pensar una entrada de teclado o consola en Java como objeto  (Leído 4079 veces)

LPM

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 35
    • Ver Perfil
Hola.

Estoy confundido con una parte del ejemplo que dan en la entrega

Código: [Seleccionar]
import java.util.Scanner;

public class EntradaDeTeclado1
{
    private String entradaTeclado;
   
    public EntradaDeTeclado1 (){
        entradaTeclado="";
        pedirEntrada();
    }

    public void pedirEntrada ()  { 
        Scanner entradaEscaner = new Scanner (System.in);
        entradaTeclado = entradaEscaner.nextLine ();   
    }

    public String getEntrada () { return entradaTeclado; }

    public String getPrimeraPalabra(){
        for (int i=0;i< entradaTeclado.length()-1;i++) {
            if (entradaTeclado.substring (i, i+1).equals(" ") ) {     
                return entradaTeclado.substring(0, i+1);         }
        }
        return entradaTeclado;
    }

    public int getLongitud(){
        return entradaTeclado.length();
    }
}


Es sobre este método específicamente

Código: [Seleccionar]
public String getPrimeraPalabra(){
        for (int i=0;i< entradaTeclado.length()-1;i++) {
            if (entradaTeclado.substring (i, i+1).equals(" ") ) {     
                return entradaTeclado.substring(0, i+1);         }
        }
        return entradaTeclado;
    }

Hay 2 return. Uno dentro del bucle y otro fuera.
Ahora bien, el segundo return, fuera del bucle, me tendría que devolver el valor del String, cosa que si se cumple la sentencia if no muestra el
String completo, sino que retorno el substring.

Aunque habiendo un return dentro de un bucle, si borro el segundo return me tira error al compilar.

Bueno, por ejemplo, si en una sentencia o un bucle tengo mas de una condición, primero se verifica el que aparece a la izquierda. Si la condición se cumple, se sigue con la siguiente condición y así.
Pero en el momento en que no se cumpla alguna condición no se verifican las otras.

Ahora, esto se aplica al método que cité? Se cumplió una condición que.. "valida" un return (devolver el substring), entonces no se verifica el siguiente (devolver el String)




Cambiando de tema, pero sobre el mismo método, lo probé con valor "hola mundo"

Código: [Seleccionar]
return entradaTeclado.substring(0, i+1);         }
con esa línea me devuelve "hola "


le saqué el +1 en el substring

Código: [Seleccionar]
return entradaTeclado.substring(0, i);         }
y devuelve "hola".


luego a

Código: [Seleccionar]
for (int i=0;i< entradaTeclado.length()-1;i++) {
le saqué el -1 y no cambia nada el resultado. no se cuál sería su... "propósito"

lo único que se me ocurre con -1 es algo así

Código: [Seleccionar]
for (int i=0;i<= entradaTeclado.length()-1;i++) {
length cuenta desde el 1, mientras que substring o métodos de Character desde el 0, entonces al usar operador <= se tendría que restar 1


comento estas 2  últimas cosas para tratar de entender el por qué está así escrito. aunque compile, un pequeño cambio y tal vez obtengas un bucle infinito, o que haga algo diferente a lo que querías que haga el método.

lo de la primera línea  tal vez no sea nada, pero del segundo directamente no lo entiendo. hay algo que se me escapa, o , nose, por eso antes de quemarme la cabeza aprovecho para consultar.

Gracias de antemano
« Última modificación: 27 de Noviembre 2014, 08:46 por Alex Rodríguez »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re: CU00661B - Pensar una entrada de teclado o consola en Java como objeto
« Respuesta #1 en: 29 de Noviembre 2014, 17:04 »
Hola, sobre la cuestión del return ten en cuenta lo siguiente:

se devuelve lo que indique el primer return que se encuentre.

No pueden existir dos return, excepto si un return está dentro de un condicional. En ese caso sí tiene sentido que existan dos return, porque el método siempre ha de devolver algo y hay que tener previsto que pueda ocurrir que no se cumpla el condicional.



Sobre la otra cuestión, lo que devuelva return entradaTeclado.substring(0, i+1); depende del valor de i, y el valor de i va cambiando cada vez que se repite el bucle (empezará valiendo 0, luego 1, luego 2, ... así hasta el último índice de la palabra).



for (int i=0;i< entradaTeclado.length()-1;i++) {

El propósito es ir desde la primera letra (posición cero de la palabra) hasta la última letra de la palabra (posición igual al valor de longitud menos uno).

Crea un código de prueba y si obtienes un resultado que no entiendas pega el código y a partir de ahí intentaría aclarar las dudas ;)
« Última modificación: 29 de Noviembre 2014, 17:11 por Ogramar »

LPM

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 35
    • Ver Perfil
Re: CU00661B - Pensar una entrada de teclado o consola en Java como objeto
« Respuesta #2 en: 29 de Noviembre 2014, 19:03 »
Hola Ogramar.

Lo del return me quedó claro, se devuelve el primer return que se encuentre.

Lo de  entradaTeclado.substring(0, i+1),en el ejemplo del curso, el resultado devuelve un string con espacio al final

Código: [Seleccionar]
public class PrimerPalabra
{
    public static void main(String[]args){
        String texto="Hola mundo";
        for (int i=0;i<texto.length();i++){
            if (texto.substring(i,i+1).equals(" ")){
                System.out.println(texto.substring(0,i+1)+"1");//el 1 aparece separado porque el substring
                                                               //termina con un espacio
            }
        }
    }
}

que, bueno, en su momento me tenía confuso porque como que es algo delicado escribir un código, te equivocás en 1 o 2 cosas y te sale cualquier cosa


lo último, sobre el for (int i=0;i< entradaTeclado.length()-1;i++) , no recorre toda la cadena

Código: [Seleccionar]
public class ContarEspacios
{
    public static void main(String[]args){
        String texto="Hola mundo ";
        int espacio=0;
        for(int i=0;i<texto.length()-1;i++){
            if (texto.substring(i,i+1).equals(" ")){
                espacio++;
            }
        }
        System.out.println(espacio);
    }
}


Aunque no recorra todo el código, solo necesita la primer palabra ,y si no hay espacio devuelve toda la cadena.

Le di vuelta a esto porque no tenia entendido lo del return. Tratando de entender, encontré  esas 2 cosas.

Pero lo mas importante me quedó claro, gracias Ogramar.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".