Este es mi codigo de la clase vector, ,me presenta problemas con los metodos, eliminar, buscar un valor, reemplazar o buscar una posición pues soy nueva en este tema. Gracias por la ayuda,
Hola...
Primero, el atributo "posicion" creo que no es necesario. Se puede hacer todo lo que se pide sin su ayuda.
Segundo, no hay ningún método eliminar().... ni podría haberlo ya que no podemos eliminar elementos de un vector una vez creado. Podemos cambiar el valor de los elementos, pero no añadir o eliminar. (Para esto se usan clases más avanzadas como los ArrayList)
Lo de cambiar el valor, podría ser lo del método reemplazar().... pero en el enunciado que pusiste no veo que esto se esté pidiendo.
Sobre el método buscarValor()
public void buscarValor(int valorDado)
{
int posicion=-1;
for(int i=0;i<vector.length; i++)
{
valorDado = Integer.parseInt(JOptionPane.showInputDialog("Digite el valor que desea buscar?"));
if(vector[i]==valorDado)
{
posicion=i+1;
JOptionPane.showMessageDialog(null,"El valor "+valorDado+" está en la posición "+posicion);
}
else
{
JOptionPane.showMessageDialog(null,"El valor "+valorDado+" no está en el vector");
}
}
}
Si lo declaras así...
public void buscarValor(int valorDado)
...implica que cuando en el código hagamos la llamada a este método, obligatoriamente habrá que pasarle un valor entero, ya que hemos indicado que tiene un parámetro llamado "valorDado", es decir, el valor que queremos buscar.
Esto sería una forma válida de hacerlo, pero dentro del método resulta que estamos pidiendo de nuevo ese valor mediante diálogos de texto.
Por lo tanto es incongruente, así que hay que elegir de una manera u otra. Si vamos a usar diálogos texto para pedir el valor, lo mejor es declarar el método sin indicar parámetros y dentro del método, declarar una nueva variable para recoger el valor que introduzca el usuario mediante los diálogos:
public void buscarValor()
{
int valorDado;
Luego, la línea:
int posicion=-1;
Hemos dicho que el atributo posicion no lo vamos a necesitar, asi que esta línea se puede borrar.
De hecho, lo que en realidad estabas haciendo en esa línea era declarar una nueva variable llamada "posicion", que nada tiene que ver con el atributo llamado "posicion".
Se llaman igual, pero son dos elementos distintos y Java los diferencia perfectamente.
En cuando pones int delante de una variable (int, o byte, o char, o float, o lo que sea...) la estás declarando como nueva, sin que tenga nada que ver con cualquier otra variable ya creada.
Si quisieramos haber utilizado el atributo "posicion" de la clase Vector, te habría bastado con poner su nombre tal cual:
posicion=-1;
O también para asegurarte y que quede bien clarito que te estás refiriendo al atributo de clase y no a otra variable, se puede usar también la palabra "this"
this.posicion=-1;
Pero en cualquier caso, no necesitamos este atributo para nada...así que simplemente eliminamos dicha línea.
Ahora viene el bucle for
for(int i=0;i<vector.length; i++)
{
valorDado = Integer.parseInt(JOptionPane.showInputDialog("Digite el valor que desea buscar?"));
if(vector[i]==valorDado)
{
posicion=i+1;
JOptionPane.showMessageDialog(null,"El valor "+valorDado+" está en la posición "+posicion);
}
else
{
JOptionPane.showMessageDialog(null,"El valor "+valorDado+" no está en el vector");
}
}
El for en principio está bien declarado, que vaya desde el principio hasta el final del vector ya que querremos buscar el valor que nos indique el usuario. Usaremos la variable "contador" del bucle for (la variable "i") como indice para señalar cada elemento del vector. Por eso no necesitamos ningún atributo "posicion".
Pero hay un error de lógica, estamos pidiendo al usuario el valor a buscar DENTRO del bucle for.
Esto implica que vamos a pedir este valor tantas veces como mida el vector. Si el vector tiene dos elementos, lo pediremos dos veces.
Si tiene 100 elementos, pediremos el valor 100 veces....
Esto no es nada lógico. Lo que queremos es pedir el valor UNA sola vez, y luego buscar en el vector a ver si existe.
Por lo tanto, la línea donde pedimos el valor a buscar, tiene que ir antes del bucle for
valorDado = Integer.parseInt(JOptionPane.showInputDialog("Digite el valor que desea buscar?"));
for(int i=0;i<vector.length; i++)
{
if(vector[i]==valorDado)
{
posicion=i+1;
JOptionPane.showMessageDialog(null,"El valor "+valorDado+" está en la posición "+posicion);
}
else
{
JOptionPane.showMessageDialog(null,"El valor "+valorDado+" no está en el vector");
}
}
Ok, ya tenemos el valor y ahora recorremos el vector, elemento a elemento, a ver si coincide con el valorDado.
Vamos a eliminar las líneas en donde estábamos usando la variable/atributo "posicion" y a modificar el código para hacer lo mismo, pero sin este atributo.
valorDado = Integer.parseInt(JOptionPane.showInputDialog("Digite el valor que desea buscar?"));
for(int i=0;i<vector.length; i++)
{
if(vector[i]==valorDado)
{
JOptionPane.showMessageDialog(null,"El valor "+valorDado+" está en la posición "+(i+1));
}
else
{
JOptionPane.showMessageDialog(null,"El valor "+valorDado+" no está en el vector");
}
}
Ahora parece que está todo correcto, PERO, si ejecutasemos este programa nos encontraríamos con un comportamiento extraño.
El bucle for, no se va a detener si encuentra una coincidencia en el vector con el elemento dado, seguirá buscando.
De hecho, tal y como está escrito, nos enseñará un mensaje por cada elemento del vector, pues cada vez que compara lanza un mensaje u otro.
Si tuvieramos 50 elementos en el vector y el valor que hemos introducido coincide con dos de ellos, este programa nos mostraría 50 mensajes: 2 diciendo que ha encontrado coincidencia y otros 48 diciendo que no se encuentra el valor dado.
Pruébalo para que veas como ocurre esto. (No hace falta 50 elementos, hazlo con 5 ó 10 como mucho...)
Este comportamiento no es lógico y hay que modificarlo. Y para modificarlo, antes tenemos que decidir qué queremos que haga este método.
¿Queremos que el bucle se detenga en cuánto encuentre una coincidencia y deje de buscar?De este modo no sabremos si otros elementos del vector también coinciden.
¿O queremos que siga buscando y nos siga avisando si encuentra más coincidencias? Porque el valor dado podría coincidir con varios elementos del vector y de este modo tendremos un mensaje por cada coincidencia.
¿O queremos que solo salga un único mensaje cuando termine de buscar, pero informando de todas las posiciones que coinciden con el valor dado, ya sea 1 posicion, 5 o las que sean....
El enunciado no especifica esto y por lo tanto podemos escoger nosotros cómo queremos hacerlo.
A mi me gusta más la última opción, un único mensaje final con todas las coincidencias que se hayan podido encontrar. (tu luego elige la posibilidad que prefieras)
Para hacer esto, podemos crear una variable de tipo String donde cada vez que encontremos una coincidencia, le añadimos la posición donde se ha encontrado el valor dado.
Y así al final de todo, cuando el bucle termine, mostramos este String en pantalla con todas las coincidencias.
Ponemos ya el código completo:
public void buscarValor()
{
int valorDado = Integer.parseInt(JOptionPane.showInputDialog("Digite el valor que desea buscar?"));
String resultado = "El valor " + valorDado + " se ha encontrado en posiciones: ";
for(int i=0;i<vector.length; i++)
{
if(vector[i]==valorDado)
{
resultado += (i+1) + " ";//Concatenamos posicion encontrada y un espacio en blanco por si se concatenan más valores
}
}
JOptionPane.showMessageDialog(null, resultado);
}
Y con este código, ya deberíamos obtener un único mensaje con todas las posibles posiciones donde hayamos encontrado el valor, ya sea solo 1 vez, o 5 o 100000 veces...
Pero aún queda un detalle...¿qué pasa si no encontramos ninguna coincidencia?
Si esto ocurre, saldrá en pantalla el contenido del String resultado pero sin ninguna posicion que mostrar, y esto no queda elegante....
Tendríamos que preparar un segundo mensaje para este caso y mostrar un mensaje u otro según si se encontró alguna coincidencia o no.
public void buscarValor()
{
int valorDado = Integer.parseInt(JOptionPane.showInputDialog("Digite el valor que desea buscar?"));
String resultado = "El valor " + valorDado + " se ha encontrado en posiciones: ";
for(int i=0;i<vector.length; i++)
{
if(vector[i]==valorDado)
{
resultado += (i+1) + " ";//Concatenamos posicion encontrada y un espacio en blanco por si se concatenan más valores
}
}
if (...)
JOptionPane.showMessageDialog(null, resultado);
else
JOptionPane.showMessageDialog(null,"El valor "+valorDado+" no está en el vector");
}
Con este if, según si se cumple una condición o no, mostraremos un mensaje u otro.
¿Y qué condición se ha de cumplir? Esto de momento te lo dejo para que lo pienses tú, a ver que se te ocurre...a ver de que manera puedes controlar el hecho de si se ha encontrado algo, o no se ha encontrado nada.
Puede que necesites añadir más lineas u otras variables de apoyo...
Sobre el siguiente método, el de buscarPosicion(), tu código tiene más o menos problemas que el anterior: se usa una variable/atributo "posicion" que no es necesaria, indicamos que el método recibe como parámetro la posición a buscar pero luego igualmente la pedimos al usuario con un diálogo de texto, y dicha petición está dentro del bucle y por lo tanto la petición se repetirá muchas veces, cuando solo queremos pedir el dato una única vez.
Intenta corregirlo con lo que he explicado y comparte por aquí de nuevo tu código y tus dudas.
Un saludo.