problemas con Scanner de Java
Hola! que tal? tengo un problema con la utilización de la clase Scanner de java, copio un fragmento de código para que se entienda mejor:
Scanner entrada = new Scanner(System.in)
String let = entrada.nextLine();
NodoArbol raux = this.buscarHijo(this.raiz, let);
BuscarHijos es un método que tiene como parámetros un nodo del arbol y un string, cuando implemento el codigo copiado anteriormente este método no cumple su función correctamente (dice que la letra let no pertenece al arbol cuando en realidad sí pertenece), pero el problema no es el método buscarHijo en sí mismo porque si en lugar de la variable let pongo,por ejemplo, "a" como parámetro del método este si funciona correctamente..
Estaría muy agradecida si alquien me puede ayudar.. es muy importante!
Saludos!
- Inicie sesión o regístrese para enviar comentarios
contenido de "let"
y cuando tecleas algo, qué valor tiene la cadena "let"? Tal vez incluye el ENTER, dependiendo del sistema operativo puede que traiga un \r o algo así. Intenta
entrada.nextLine().trim()
.Explicación
Puse la explicación como respuesta en otro tema, el funcionamiento de la clase Scanner no es tan intuitivo, lee por aquí: http://www.javamexico.org/foros/java_standard_edition/lectura_por_teclad...
Saludos.
CRei que habia mejorado pero
CRei que habia mejorado pero recíen estuve probando y me di cuanta de que sigue sin andar..no se que es lo que pasa!!
Hay alguna otra forma de obtener datos ingresados por teclado ademas del Scanner?
Saludos!
readLine()
Que onda, ahora cual es el problema que tienes con Scanner? puedes usar readLine() para leer desde consola.
Saludos.
Y si pones todo el código ?
Hola PaoCe, porque no pones todo el código que te esta dando el problema. para checar tambien el método BuscarHijo.
Saludos
@santos.r09 se fue!
Santos se fue Paoce yo estaba esperando que pusiera el codigo mmmm pero buenoo, espero ayas solucionado tu problema Paoce.
Por aqui andamos.
Saludos.
Aca envio el codido entero:
Aca envio el codido entero:
private Scanner entrada = new Scanner(System.in);
//La idea de este metodo es determinar si una determinada letra es descendiente del nodo n , cada nodo
//tiene como atributo su rpmer hijo y su siguiente hermano
es = false;
if (this.estaVacio())
throw new ArbolVacioExcepcion();
NodoArbol aux = new NodoArbol();
aux = n.getPrimerHijo();
while (aux != null) {
if (aux.getInfo() == letra)
es = true;
if (es == true)
break;
aux = aux.getSgteHermano();
}
if (es == true)
return aux;
else
throw new NodoExcepcion("Error: la palabra no pertenece al diccionario");
}
public void analizar() throws ArbolVacioExcepcion, NodoExcepcion, Exception{
String let = entrada.nextLine(); // el rpoblema está en esta parte, si por ejemplo ingreso por teclado una a, me dice que no pertenece
// al diccionario, y si en la linea siguiente pongo NodoArbol raux = this.buscarHijo(this.raiz,"a") me dice que si pertenece
//cuando en realidad debería ser lo mismo, debe ser alguna característica del nextLine, que guarda tambien el enter o algo asi
// probe con nextLine().trim() y pasa lo mismo
NodoArbol raux = this.buscarHijo(this.raiz,let);
System.out.println(raux.getInfo());
//Trie aux = new Trie(raux);
//aux.analizar();
}
Gracias por preocuparse!!
}
Ya verificasté que contiene 'let' ?
Buen día PaoCe, oye ya hiciste lo que te dijo ezamudio, lo de utilizar trim(); otra cosa, deberías verificar que contiene la variable let (depués de nextLine()), simplemente imprimela tal cuál y ver que tamaño tiene,
System.out.println(let.toString); System.out.println(let.length());
para ver si tienes carácteres raros.Saludos
Ya probe de imprimer el
Ya probe de imprimer el contenido de let y me parece correctamente, pero sigue sin funcionar correctamente,
Saludos!
muy raro ¡
Otro favor pon la descripción del error, textualmente lo que te arroja la JVM, el stacktrace.
Console
Hola PaoCe, en este post, Ezamudio planteo otra forma de leer desde el teclado.
Saludos
no larga un error, el
no larga un error, el problema es que cuando ingreso por telcado una letra que si pertenece al arbol me dice que no, por ejemplo si ingreso por teclado una "a" dice que no pertenece, pero si en lugar de ingresarla por teclado escribo:
raux = this.buscarHijo(this.raiz,"a"), lo encuentra, cuando deberia ser lo mismo!
saludos!!
En tu IDE, corriendo en modo
En tu IDE, corriendo en modo debug , paso por paso, muestra que valor esta guardando esa variable, me late que esta guardando su valor Ascii.
problrma solucionado!!!
problrma solucionado!!! gracias a todos!!
Puedes compartirnos como lo
Puedes compartirnos como lo resolviste?.
Saludos
equals()
Esta comparando cadenas con == en vez de equals() y por eso solamente funciona con la "a" en codigo duro; Java internaliza los strings de codigo duro para que todos apunten a la misma instancia pero cuando se captura del teclado es otra instancia aunque tenga el mismo contenido.
Entonces seria algo asi?
@ezamudio entonces seria algo asi?
es = true;
if (es == true)
break;
aux = aux.getSgteHermano();
}
if (es == true)
return aux;
else
throw new NodoExcepcion("Error: la palabra no pertenece al diccionario");
}
Saludos.
¿Por qué no ocupas BufferedReader?
....
BufferedReader teclado= new BufferedReader (new InputStreamReader(System.in));
String cadena=teclado.readLine();
...
...
En ves de Scanner
¿Cómo lo solucionaste?
:)
Saludos¡
equals
Sí, la cosa es cambiar por
aux.getInfo().equals(letra)
. Hay varias redundancias ahí; comoes==true
porquees
ya es una variable tipoboolean
de modo que es suficiente con ponerif (es)
además que las estructuras de control están muy mal utilizadas, por ejemplo esebreak
más bien debe ser unelse
y de hecho se podría simplificar bastante:aux = aux.getSgteHermano();
}
if (aux == null) {
throw new NodoException("bla");
}
return aux;
Solución
el problema era la comparación de strings, tal como dijo ezamundio..
Muchas gracias a todos por su ayuda!
Saludos!