AYUDA con un problema de un programa en JAVA

Bueno, estoy desperate, porque no tengo ni idea del problema que me surge al compilar la clase con el BlueJ.

........................................................................................................
import nsIO.*;
import java.io.*;
import java.util.*;
import excepciones.*;
import modelos.*;


public class TestTraductor{
static int menu(input t){
int op;
System.out.println();
System.out.println(" M E N U ");
System.out.println(" - - - - - - - - - - - - - - -- - - - - - - - - -");

System.out.println("1.-Traducir frase ");
System.out.println("2.-Cambiar de Diccionario");
System.out.println("3.-Caracteristicas del Diccionario actual");
System.out.println("4.-Buscar una Entrada por clave en el Diccionario actual");
System.out.println("5.-Insertar una nueva Entrada en el Diccionario actual");
System.out.println("6.-Eliminar una Entrada por clave del Diccionario actual");
System.out.println("7.-Guardar el Diccionario actual");
System.out.println("8.-Guardar ORDENADO el Diccionario actual");
System.out.println("9.-Buscar las tres entradas sucesoras a una clave dada");
System.out.println("10.-Salir");
// lectura de opci�n
do{
System.out.print(" Elija una de las opciones (1,2,3,4,5,6,7,8,9,10): ");
op = t.readint();
} while (op <1 || op >10);
return op;
}// fin de menu

public static void main(String args[]){
input teclado = new input();
Traductor t = new Traductor();
int opcion;
do{
opcion = menu(teclado);
switch (opcion){
case 1: // traducir PALABRA A PALABRA una frase dada
{
System.out.println(" Por favor, introduzca la frase que desea traducir");
String frase = teclado.readline();
System.out.println("Frase a traducir: "+frase);
try{
System.out.println("Frase traducida: "+t.traduccion(frase));
}catch (Exception e) {System.out.println(e);}
}
break;
case 2: // cambiar el Diccionario actual por otro
{
System.out.println(" Introduzca el nombre del fichero que contiene el nuevo Diccionario");
String nombreFichero = teclado.readline();
try {
t.cambiarDiccionario(nombreFichero);
}
catch(FileNotFoundException e){System.out.println(e);}
}
break;
case 3: // consultar las caracter�sticas del Diccionario actual
{
System.out.println(t.caracteristicasDiccionario());
}
break;
case 4: // buscar una Entrada del Diccionario actual
{
System.out.println(" Por favor, introduzca la palabra a buscar");
String clave = teclado.readline();
Entrada conClave = new Entrada(clave.toLowerCase().trim());
try{
Entrada buscada = t.buscarEnDiccionario(conClave);
System.out.println(" Encontrada la Entrada del Diccionario "+buscada);
} catch (ElementoNoEncontrado e){
System.out.println(" Lo siento, el Diccionario NO posee una Entrada con clave "+clave);
}
}
break;
case 5: // insertar una Entrada al Diccionario actual
{
boolean f=false;
System.out.println(" Por favor, introduzca la palabra a traducir");
String clave = teclado.readline();
System.out.println(" Por favor, introduzca la traduccion de "+clave);

//Completar ...
String valor=teclado.readline();
Entrada nueva=new Entrada(clave.toLowerCase(), valor.toLowerCase());
try{
t.insertarEnDiccionario(nueva);
}catch (Exception e)
{ System.out.println(e);
f=true;
}

if (!f) System.out.println("Insercion correcta");
}
break;
case 6: // eliminar una Entrada del Diccionario actual
{
boolean f=false;
System.out.println(" Por favor, introduzca la palabra a eliminar");

//Completar ...
String clave=teclado.readline();
Entrada aux=new Entrada(clave);
try{
t.eliminarDelDiccionario(aux);
}catch (Exception e)
{ System.out.println(e);
f=true;
}

if (!f) System.out.println("Se ha eliminado correctamente");
}
break;
case 7: // guardar Diccionario actual en un fichero de texto de Entrada's
{
try{
System.out.println(" Indique el nombre del fichero donde guardar el Diccionario actual");
String nombreFichero = teclado.readline();
t.guardarDiccionario(nombreFichero);
System.out.println(" El diccionario ha sido guardado en "+nombreFichero);
}catch (FileNotFoundException e) { System.out.println(e);}
}
break;
case 8: // guardar ORDENADO el Diccionario actual en un fichero de texto de Entrada's
{
try{
System.out.println(" Indique el nombre del fichero donde guardar ORDENADO el Diccionario actual");
String nombreFichero = teclado.readline();
t.guardarDiccionarioOrdenado(nombreFichero);
}catch (FileNotFoundException e) { System.out.println(e);}
}
break;

case 9: //buscar las tres entradas sucesoras a una clave dada
{
try{
System.out.println("Dame la clave para las entradas sucesoras:");
String clave= teclado.readline();
Entrada d1= sucesor(clave);
Entrada d2= sucesor(d1);
Entrada d3= sucesor(d2);
System.out.println(" Las Entrada sucesoras son "+d1 +d2 +d3);
}catch (FileNotFoundException e) {System.out.println(e);}
}break;
case 10: System.out.println(" Hasta pronto.");
}
}
while(opcion != 10);
}
}
..................................................................................................

El error me lo da en la línea en negrita, bueno, y en las siguientes que usan ese método, aunque para ahí. Me da este error:

cannot resolve symbol - method sucesor (java.lang.String)

el método sucesor calcula el nodo sucesor a uno dado via la clave que se le pasa. El tema está en que la práctica es un tocho de clases, test traductor, traductor, ABBdiccionarioBilingue, diccionarioBilingue etc... y luego en otro proyecto están las clases ABB, ABBDiccionario, Diccionario, donde está implementado el método. Estas van heredandolo etc.... y en teoría no hay conflictos porque todas compilan bien.

Si algún gurú del foro me puede ayudar, es que tengo el exámen de prácticas el jueves al mediodía, y tengo que solucionar la gilipoyez esta. Si el error está en test traductor, y no me he dado cuenta es posible porque voy loco ya, si no conseguis verlo ahí, o quereis os puedo pasar todo el directorio de trabajo para que lo veais con el bluej o lo que querais, por si está en otro paquete y tpc me he dado cuenta.

Ayuda mamaaaaaaa [mamaaaaa]
Has comprobado que esten incluidos todos los java. en concreto el del error? pq ese error te da cuando no importas un paquete java. o javax.
MORPHEUX escribió:Has comprobado que esten incluidos todos los java. en concreto el del error? pq ese error te da cuando no importas un paquete java. o javax.


Si, importo (import modelos.*) la case Diccionario, que es una interfaz, y donde está declarado sucesor. (la implementación está en otro paquete, con ABB y ABBdiccionario).

El caso es que la clase traductor, tiene un atributo AbbdiccionarioBilingue (que extiende de ABBdiccionario y de DiccionarioBilingue, que a su vez extiende Diccionario, que....) entonces, he tratado de declarar el método tb en la clase traductor, y hacer que llame a la de ABB.... y luego en la clase donde me da error llamar a ese método, pero me dice que es privado y no lo puedo llamar, aunque en teoría esa modificación no debo hacerla (según las instrucciones de la práctica).

No se, ya digo, si alguien quiere que le pase todo para curiosear, a lo mejor con perspectiva lo pilla lo que yo no me doy cuenta. [burla3]
Shane54 escribió:
Si, importo (import modelos.*) la case Diccionario, que es una interfaz, y donde está declarado sucesor. (la implementación está en otro paquete, con ABB y ABBdiccionario).


Así sin leerme todo el código (sin indentación no hay corrección [burla2]) y habiendo leído lo citado y la negrita: si pretendes usar ese método y el mismo pertenece a otra clase distinta a donde lo utilizas, tendrás que instanciar un objeto de esa otra clase para poder utilizarlo, no poner ahi un sucesor(String s) a las bravas porque evidentemente, si no pones Algo.sucesor() busca el método como propio de la clase donde se instancia y al no encontrarlo --> cannot resolve symbol.

Además, si dices que ese método es privado en su clase no vas a poder utilizarlo de todas formas así que una de dos:

1. Modificas la definición del método poniéndolo public

2. Creas un nuevo método público en la clase que simplemente llame a sucesor() (al llamarlo desde dentro de la clase no te dará problemas el private)


No sé si me habré colado en algo porque así a medio leer es dificil de entender bien el tema, pero hay hambre y la cena está en la mesa esperando [sati]

Un saludo.
ewok escribió:
Así sin leerme todo el código (sin indentación no hay corrección [burla2]) y habiendo leído lo citado y la negrita: si pretendes usar ese método y el mismo pertenece a otra clase distinta a donde lo utilizas, tendrás que instanciar un objeto de esa otra clase para poder utilizarlo, no poner ahi un sucesor(String s) a las bravas porque evidentemente, si no pones Algo.sucesor() busca el método como propio de la clase donde se instancia y al no encontrarlo --> cannot resolve symbol.

Además, si dices que ese método es privado en su clase no vas a poder utilizarlo de todas formas así que una de dos:

1. Modificas la definición del método poniéndolo public

2. Creas un nuevo método público en la clase que simplemente llame a sucesor() (al llamarlo desde dentro de la clase no te dará problemas el private)


No sé si me habré colado en algo porque así a medio leer es dificil de entender bien el tema, pero hay hambre y la cena está en la mesa esperando [sati]

Un saludo.


En teoría lo que dices debería ser así, pero no hay forma. Ya he intentado declararlo como público, añadiéndolo a la clase traductor y que llame al de diccionario y este público, y no consigo. Voy a volver a rayarme a ver.

El tema está en que se tiene que llamar al método sucesor, del diccionario que ya tiene el traductor, no puedo crear otra instancia porque no tendría nada que ver. He probado a declarar public el atributo diccionariobilingue de traductor, y llamarlo y nada, me da ese error.
no me he leido el código, pero como es un fallo que me pasa muy a menudo, ¿no serán problemas de mayúsculas y minúsculas?
Mmm no entiendo esto:

haces: Entrada aux=new Entrada(clave); bien

pero al hacer esto: Entrada d1= sucesor(clave); ese espacio??? entre "Entrada" y "d1" no se para mi que falta algo o yo estoy saturado ;-)


Bueno voy a seguir con lo mio que los threads no me dejan dormir
Hola a todos.

Que yo recuerde Java es orientado a objetos puro.
Por lo que me da la sensacion, te falta crear un nuevo objeto que pueda hacer la llamada a ese metodo en concreto. Claseobjeto objeto = new Claseobjeto
Tienes que comprobar que el classpath es correcto, sino no tiene ni idea de donde ir a buscar el metodo.
Si el metodo es privado siempre podras crear un metodo publico que lo unico que haga es invocar al metodo privado y con eso lo tienes todo solucionado.

Espero haberte ayudado, nunca he trabajado con dos proyectos distintos, pero me imagino que tendras que hacer un import proyecto2.*, pero date cuenta de que lo va a ir a buscar a donde estan las clases por defecto, asi que procura mirar bien el classpath.

Un saludo y suerte con las practicas.

Edito: pues no edito nada, porque iba a poner una burrada.
Bueno buenas tardes lo primero, es la primera vez que entro aqui y he visto esta peticion aunque supongo que un poco tarde y me estado mirando el trozo de codigo que ha puesto y claro como todos bien dicen faltaria ver el resto de clases, pero una cosa me intriga y no se si estare equivocado( supongo) pero:
Entrada d1= sucesor(clave);
Entrada d2= sucesor(d1);
Entrada d3= sucesor(d2);

si se te queja en el primero no sera porque el metodo sucesor
espera de parametro un parametro de tipo entrada i no un
string? porque clave es un string segun tu codigo.
Sino tienes una sobrecarga de ese metodo en su clase, no puedes llamar al mismo metodo con parametros de clase diferente


Bueno no se, =)
Xao
8 respuestas