Java - Limpiar Scanner cada iteración

 
Vista:
sin imagen de perfil

Limpiar Scanner cada iteración

Publicado por Andrew (9 intervenciones) el 23/10/2013 16:20:28
Buenas, tengo una aplicación en Java que pide interacción contínua con el usuario (por pantalla).

Se trata de un simple:

Scanner variable = new Scanner(System.in);
String usuario;

....

usuario = variable.next();
-------------------------

La cosa es que le pregunto cosas muchas veces, y bueno, si no haces cosas raras, todo va bien, pero, si metes muchas cosas seguidas, al estilo:
"texto1->intro->texto2->intro->texto3->intro" (todo esto muy rápido, de seguido)
pues lo que pasa es que pilla el texto1 para la primera entrada de teclado, y a la siguiente vuelta, pilla automáticamente texto2. Yo lo que quiero es que si haces el tonto, como en el ejemplo anterior, pase de ti. O sea, que pille el texto1, y que cuando vuelva la siguiente "usuario = variable.next()", el Scanner se haya "limpiado", o sea, que no haya rastro de texto2 ni texto3.

La verdad, ando bastante perdido en esto... y aunque no sea importante para que el programa funcione (ya que las respuestas erróneas están contempladas), pues molaría cambiarlo, porque queda más "bonito".

¡Muchas gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Limpiar Scanner cada iteración

Publicado por Vicente (56 intervenciones) el 23/10/2013 17:45:41
Me encantaria ayudarte, pero no entiendo tu duda, creo que no te explicas bien. Explica bien y con código lo que quieres hacer y enseguida se te soluciona.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Limpiar Scanner cada iteración

Publicado por UnoPorAhi (128 intervenciones) el 23/10/2013 18:04:51
Yo tampoco entiendo que quieres limpiar. Parece que escribis lo que se os pasa por la cabeza y ale! "Enviar Datos"! El 90% de los mensajes en este foro no hay por donde cogerlos...

Internamente el buffer de Scanner se limpia automaticamente cada vez que lees un dato. No se puede hacer explicitamente. Es esa tu duda?

Si lo que quieres es ignorar el cuando el usuario ha metido un intro vacio, solo tienes que controlarlo programandolo.


Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Limpiar Scanner cada iteración

Publicado por Andrew (9 intervenciones) el 23/10/2013 19:09:13
Macho, aplícate el cuento:
"Parece que escribis lo que se os pasa por la cabeza y ale! "Enviar Datos"! "

Que no me explique bien, no quiere decir que no piense lo que pongo, que sois unos quisquillosos, incapaces muchas veces de tratar de entender más allá de lo literal...
A ver si ahora me explico mejor. No pongo más código porque en realidad no hay mucho más que poner....

A ver, el programa es un juego, que empieza haciendo preguntas, y mostrando cosas por pantalla. Lo primero que pregunta es: "¿Cuántos jugadores sois?", mostrándolo por pantalla, entonces, pide al usuario la respuesta:

usuario = variable_scanner.nextInt(); //el tema de las excepciones está tratado, por eso ni preocuparos

Para meter la respuesta, la acción del usuario es: "número->intro" Y cuando apreta Intro, el sistema coge el número, lo procesa, y muestra más opciones al jugador, como pedir el nombre de los jugadores. Entre que el usuario ha respondido a la primera pregunta, y se formula la siguiente (la siguiente ejecución de "scanner.next()"), pasan unos segundos, porque hay unos delays en las cosas que se muestran por pantalla, y hay tiempo de sobra.
El problema que tengo es que, mientras transcurre este tiempo, el usuario puede volver a meter datos aunque no se los pidan, de forma que puede volver a escribir un número, y pulsaro Intro. Pues bien, si lo hace, cuando se formula la siguiente pregunta, en vez de esperar, directamente coge ese último dato que metió el usuario a destiempo. Y lo que yo quiero es que ese dato a destiempo se obvie, o sea, que cuando pregunte, si hay algo almacenado en el buffer (o donde sea), no lo tenga en cuenta, y sólo entonces se pueda introducir texto.

El código me parece un poco inútil en este caso, ya que sería algo así como:

-------------------------------
System.out.prinln("pregunta 1");
usuario = var_scanner.next();

Function(usuario); //unos cuantos procesos relacionados con el juego..
System.out.prinln("cosas"); // unas cuantas salidas por pantalla con información para el jugador

System.out.prinln("pregunta 2");
usuario = var_scanner.next();
Function(usuario);

-----------------------------

El código real no lo pongo, porque, a parte de que no viene al caso, las cosas están en diferentes clases (unas cuantas), y lo que llamo Function() pueden llegar a ser varias decenas de líneas de código irrelevantes para mi problema.

A ver si así se entiende mejor. Que "ahora sí que he pensado lo que escribo".....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Limpiar Scanner cada iteración

Publicado por UnoPorAhi (128 intervenciones) el 01/12/2013 17:31:19
Si, así es como debías haber planteado tu caso al principio. Si tienes un problema que quieres que te solucionen y sabes explicarlo, es absurdo que no lo hagas.

Tras el mes de veto por tus primeras dos lineas de respuesta, comentar que lo que tienes que utilizar es .nextLine() en lugar de next().

next() busca tokens en la misma linea introducida por lo que espera el enter al terminar de meter toda la info.


Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar