Autor Tema: Ejemplo BufferedReader java Ejercicio CU00681B.Tipos enumerados(enum)  (Leído 10321 veces)

arcanFAC

  • Visitante
Hola, aquí presento el ejercicio. Aprovecho para exponer un problema el cual se me presenta aveces y tambien se me presentó rasolviendo este ejercicio. El problema puntualmente es que cuando intento leer con un objeto de la clase Scanner, cuando coloco nextLine(); hay veces que no me lee nada, y a la variable me le asiga vacio. Es por eso que en este ejercicio decidí adoptar BufferedReader, ya que con mis escasos conocimientos no pude solventar el problema. Si me pueden ayudar con esto se los agradeceria. Sin mas aquí está el ejercicio:

Citar
Crea una clase Vehiculo donde definas un tipo enumerado MarcaDeVehiculo cuyos valores posibles serán FORD, TOYOTA, SUZUKI, RENAULT, SEAT. Establece como atributos de la clase matricula (tipo String) y marca (tipo MarcaDeVehiculo) y crea los métodos getters (para obtener) y setters (para establecer el valor) de los atributos. Escribe un pequeño programa de prueba donde verifiques que los métodos funcionan correctamente.

Código: [Seleccionar]
enum MarcaDeVehiculo{FORD, TOYOTA, SUZUKI, RENAULT, SEAT};
public class Vehiculo {
private String matricula;
private MarcaDeVehiculo marca;

public Vehiculo(){

}

public void setMatricula(String matricula){
this.matricula = matricula;
}

public void setMarca(int opcion){
if(opcion == 1)
marca = MarcaDeVehiculo.FORD;
else if(opcion == 2)
marca = MarcaDeVehiculo.TOYOTA;
else if(opcion == 3)
marca = MarcaDeVehiculo.SUZUKI;
else if(opcion == 4)
marca = MarcaDeVehiculo.RENAULT;
else if(opcion == 5)
marca = MarcaDeVehiculo.SEAT;
}

public String getMatricula(){
return matricula;
}

public String getMarca(){
return marca.toString().toLowerCase();
}

}
Código: [Seleccionar]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    public static void main(String[] args) throws IOException {
Vehiculo datosVehiculo = new Vehiculo();
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
System.out.print("FORD: Escriba 1\nTOYOTA: Escriba 2\nSUZUKI: Escriba 3\nRENAULT: Escriba 4\nSEAT: Escriba 5\nPor favor seleccione una marca: ");
datosVehiculo.setMarca(Integer.parseInt(bf.readLine()));
System.out.print("Escriba la matricula del vehiculo: ");
datosVehiculo.setMatricula(bf.readLine());
        System.out.println("Estos son los datos del vehiculo.\nMarca: " + datosVehiculo.getMarca() + "\nMatricula: " + datosVehiculo.getMatricula());
}

}
Subo tambien el algoritmo como lo tenia cuando me dió el problema:
Código: [Seleccionar]
import java.util.Scanner;
public class Ejemplo {
public static void main(String[] args){
Vehiculo datosVehiculo = new Vehiculo();
Scanner sc = new Scanner(System.in);
System.out.print("FORD: Escriba 1\nTOYOTA: Escriba 2\nSUZUKI: Escriba 3\nRENAULT: Escriba 4\nSEAT: Escriba 5\nPor favor seleccione una marca: ");
datosVehiculo.setMarca(sc.nextInt());
System.out.print("Escriba la matricula del vehiculo: ");
datosVehiculo.setMatricula(sc.nextLine());
                System.out.println("Estos son los datos del vehiculo.\nMarca: " + datosVehiculo.getMarca() + "\nMatricula: " + datosVehiculo.getMatricula());
}

}

Saludos y gracias por su tiempo.
« Última modificación: 06 de Abril 2015, 00:08 por Ogramar »

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:Aprender java.CU00681B.Tipos enumerados(enum) java.
« Respuesta #1 en: 04 de Abril 2015, 11:38 »
Hola arcanFAC

Has solucionado el problema recurriendo al API de Java. Bien por tí.

He observado el comportamiento de nextInt() en tu código, y no llego a comprender el porqué de ese comportamiento.
Espero que el foro pueda ayudarte y de paso aprender yo también.

Por otro lado, veo que en la clase Main, cuando quieres leer un int, lees una línea entera y la pasas a Integer.
En la clase Ejemplo podías haber hecho lo mismo:
        datosVehiculo.setMarca(Integer.parseInt(sc.nextLine()));
La línea anterior funciona en tu código.

Saludos

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:Ejemplo BufferedReader java Ejercicio CU00681B.Tipos enumerados(enum)
« Respuesta #2 en: 06 de Abril 2015, 00:09 »
Hola aquí hay descrito un problema con Scanner en BlueJ y la respuesta obtenida, quizás sea útil

www.aprenderaprogramar.com/foros/index.php?topic=1211

Salu2

arcanFAC

  • Visitante
Re:Ejemplo BufferedReader java Ejercicio CU00681B.Tipos enumerados(enum)
« Respuesta #3 en: 09 de Abril 2015, 01:17 »
Hola, investigando me topé con una pagina en donde se respondia esta pregunta; No coloco directamente el link, pero la respuesta es la siguiente:
Citar
La clase Scanner divide los datos ingresados de dos maneras, por líneas y por tokens, cuando haces nextLine() obtienes toda la línea, pero cuando obtienes next(), nextByte(), nextInt(), etc... obtienes el token siguiente (aunque esté en la misma línea) según un delimitador que puedes configurar. Este comportamiento es útil cuando le dices a Scanner que lea a partir un archivo, pero de alguna manera se anula cuando lees directo de System.in, por eso el comportamiento extraño, ahora explico.

Cuando lees con nextInt() (en tu caso, aunque es el mismo para los demás excepto nextLine()) la instancia de Scanner te devuelve lo ingresado, pero el enter que le tiene que dar el usuario lo guarda en el input, es por eso que cuando viene después el nextLine() lee lo que quedó del input (el salto de línea) y da otro más por el mismo comportamiento de nextLine(), entonces es como si el usuario hubiera dado un enter sin haber escrito nada.

Mira lo que dice la documentación de Scanner:

    String nextLine()
    Advances this scanner past the current line and returns the input that was skipped.
Esto se soluciona leyendo el dato con next(); en vez de nextLine(); pero si necesitas leer toda la linea despues del nextInt();(en mi caso particular con este ejercicio) se colcoca despues de la lectura del entero sc.nextLine(); para que "lea" el salto de linea pero no se lo asigna a nada  :).
Saludos.

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:Ejemplo BufferedReader java Ejercicio CU00681B.Tipos enumerados(enum)
« Respuesta #4 en: 09 de Abril 2015, 08:57 »
Gracias!

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:Ejemplo BufferedReader java Ejercicio CU00681B.Tipos enumerados(enum)
« Respuesta #5 en: 09 de Abril 2015, 16:00 »
Me ocurrio algo parecido muchos ejercicios atrás y como indicas al hacer nextLine() coge toda la linea y la unica forma que vi de solucionarlo es hacer un new Scanner con el mismo nombre que el anterior y dividirlo en metodos segun que entrada pretendia obtener, int o line etc.. (variable de método)

El resto ya lo has visto tu solo genial ArcanFAC
« Última modificación: 09 de Abril 2015, 16:21 por Lorenzo31 »

 

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".