style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

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!

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

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().

Imagen de benek

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!

Imagen de JaimeItlzc

readLine()

Que onda, ahora cual es el problema que tienes con Scanner? puedes usar readLine() para leer desde consola.

Saludos.

Imagen de santos.r09

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

Imagen de JaimeItlzc

@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

 public NodoArbol buscarHijo(NodoArbol n, String letra)throws ArbolVacioExcepcion, NodoExcepcion{
        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!!

}

Imagen de santos.r09

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!

Imagen de santos.r09

muy raro ¡

Otro favor pon la descripción del error, textualmente lo que te arroja la JVM, el stacktrace.

Imagen de francisco.santiagoj

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!!

Imagen de francisco.santiagoj

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!!

Imagen de francisco.santiagoj

Puedes compartirnos como lo

Puedes compartirnos como lo resolviste?.

Saludos

Imagen de ezamudio

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.

Imagen de JaimeItlzc

Entonces seria algo asi?

@ezamudio entonces seria algo asi?

if (aux.getInfo().equals(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");
}

Saludos.

¿Por qué no ocupas BufferedReader?

import java.io.*;
....

BufferedReader teclado= new BufferedReader (new InputStreamReader(System.in));
String cadena=teclado.readLine();
...
...

En ves de Scanner

¿Cómo lo solucionaste?

:)

Saludos¡

Imagen de ezamudio

equals

Sí, la cosa es cambiar por aux.getInfo().equals(letra). Hay varias redundancias ahí; como es==true porque es ya es una variable tipo boolean de modo que es suficiente con poner if (es) además que las estructuras de control están muy mal utilizadas, por ejemplo ese break más bien debe ser un else y de hecho se podría simplificar bastante:

while (aux != null && !aux.getInfo().equals(letra)) {
  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!

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">