Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: arcanFAC en 03 de Abril 2015, 03:10

Título: Ejemplo BufferedReader java Ejercicio CU00681B.Tipos enumerados(enum)
Publicado por: arcanFAC en 03 de Abril 2015, 03:10
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.
Título: Re:Aprender java.CU00681B.Tipos enumerados(enum) java.
Publicado por: toni_apr 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
Título: Re:Ejemplo BufferedReader java Ejercicio CU00681B.Tipos enumerados(enum)
Publicado por: Ogramar 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
Título: Re:Ejemplo BufferedReader java Ejercicio CU00681B.Tipos enumerados(enum)
Publicado por: arcanFAC 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.
Título: Re:Ejemplo BufferedReader java Ejercicio CU00681B.Tipos enumerados(enum)
Publicado por: Ogramar en 09 de Abril 2015, 08:57
Gracias!
Título: Re:Ejemplo BufferedReader java Ejercicio CU00681B.Tipos enumerados(enum)
Publicado por: Lorenzo31 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