1

Tengo el siguiente ejercicio de "principiante" en Java en donde no consigo encontrar la manera de recorrer toda la array "dni" y compararlo si es igual a la variable que he creado "consulta".

Crea un array con 6 nombres de alumnos y otro array con sus 6 DNI en orden correlativo. Pide al usuario que introduzca un DNI y si está en el array debe mostrar el nombre del alumno correspondiente.

Mi código hasta ahora es el siguiente:

Scanner teclado = new Scanner(System.in);

    String[] alumnos = { "Xavi", "Nacho", "Arnau", "Denis", "Wiliam", "David" };

    String[] dni = { "11111111-A", "11111111-B", "11111111-C", "11111111-D", "11111111-E", "11111111-F" };

    System.out.println("Introduce un DNI");
    String consulta = teclado.nextLine();

    for (int i = 0; i < dni.length; i++) {

        if (dni[i] == consulta) {
            System.out.println(alumnos[i] + " " + dni[i]);
        } 
        for (int j = 0; j < dni.length; j++) {
            if (dni[j] != consulta) {
                System.out.println("No existe ningún almuno con DNI: " + consulta);
                j = dni.length;
            }
        }
    }
Azumay404
  • 153
  • 8

2 Answers2

1

Deberías usar una variable fuera del for para hacer el recorrido de tal forma que si la consigues te quede el indice en esa variable

int i = 0;
for (; i < dni.length; i++)

El otro problema que tienes es que estás comparando cadenas con ==. Esa comparación con cadenas en java solo funcionaría bajo ciertas condiciones. Es buen consejo que uses el método equals()

if (consulta.equals(dni[i]))

Si el valor es el mismo, haces un break. No hagas mas nada en el for. Finalmente (ya fuera del for) mira el valor de i. Si es menor a la cantidad de DNIs, indica que lo conseguiste y muestras el nombre que corresponde a ese indice. Si el valor es mayor o igual a la cantidad de DNIs, supongo que sabes qué sucedió, cierto?

eftshift0
  • 2,571
  • 1
  • 3
  • 10
1

Si bien eftshift0 ya respondió, te explicaré por qué no funciona y cómo solucionarlo.

Para empezar, haces un recorrido sobre el vector de DNIs, pero por cada uno de los elementos del vector (6 en este caso), intentas comparar si es igual al que has introducido por teclado, imprimiendo el mensaje "No existe ningún alumno con DNI...".

Si bien el recorrido se realiza correctamente (recorres todo el vector), el mensaje se imprime para cada uno de sus elementos, por lo que cuando introduces un DNI por teclado, se ven 6 mensajes en la pantalla (consola). Esto es así porque se ha recorrido 6 elementos (DNIs), y todos han sido distintos al que se ha introducido por teclado.

Lo que no es correcto en este caso es anidar un bucle dentro de otro, porque solo estarías realizando las mismas comprobaciones muchas veces más.

Para saber si has encontrado un elemento no debes imprimir un mensaje cada vez que realizas una comparación, sino que debes recorrer el vector, y al terminar el recorrido, imprimir el resultado de la operación. Esto se consigue almacenando en alguna variable fuera del bucle algún valor que te indique si se ha encontrado o no el elemento introducido por teclado.

Una opción puede ser guardar en una variable el índice del elemento encontrado. Y si el índice está fuera del rango de índices del vector, se considerará que no lo has encontrado.

int indice = -1;  // Valor inicial inválido
for (int i = 0; i < dni.length; i++) if (/* son iguales */) indice = i;
if (indice == -1) System.out.println("No se ha encontrado");
else System.out.println("Se ha encontrado");

La comprobación de igualdad de cadenas se debe realizar con el método equals, y no con el operador de igualdad ==. Esto se debe a que las cadenas son objetos. Y para objetos, el operador de igualdad == no comprueba si el contenido de las cadenas son iguales, sino que comprueba si las dos cadenas son la misma (un solo objeto).

Sin embargo, puede haber dos (o más) objetos con identificadores (OID) distintos, que ocupan zonas de memoria distintas, pero teniendo el mismo contenido. En estos casos, el operador de igualdad dice que son objetos distintos, aunque tengan el mismo contenido. Por ello surge el método equals, que compara no solo la referencia sino el contenido de los objetos.

Puedes obtener más información sobre esto en mi respuesta a otra pregunta, y aún más en esta pregunta.

Por tanto, la comparación de igualdad de cadenas sería:

if (dni[i].equals(consulta)) ...

Ahora bien, explicado todo lo anterior, una mejor opción es realizar una operación de búsqueda en vez de un recorrido, ya que no son lo mismo: un recorrido es una operación en la que se recorre todos los elementos de una colección para realizar alguna operación; mientras que una búsqueda es la operación de encontrar un elemento concreto de la colección, deteniéndose en el momento en que se encuentra dicho elemento.

int i = 0;
while (i < dni.length && !dni[i].equals(consulta)) i++;
if (i != dni.length) System.out.println("Se ha encontrado");
else System.out.println("No se ha encontrado");

Si el elemento no se encuentra en el vector, dicho vector se recorrerá por completo y la variable i será igual a dni.length. Algo muy importante es que en una búsqueda, al salir del bucle, se debe comprobar por qué se ha salido del mismo: si porque se ha encontrado el elemento, o porque se ha llegado al final del vector sin encontrarlo.

Pero hay que tener en cuenta que si no se ha encontrado el elemento, no se debe acceder al vector, ya que el índice apuntaría al elemento que se debería encontrar después del último, y como no existen elementos después del último, obtendrías una excepción de índice fuera de rango. Por tanto, la comprobación se hace con respecto al índice: si ha llegado a dni.length o no.

Por último te comentaré que se puede hacer una búsqueda con un bucle for, como ha indicado eftshift0 en su respuesta, es decir, en el cuerpo del bucle se comprueba si hemos encontrado el elemento, y si se ha encontrado se rompe el bucle con la instrucción break.

Si bien esto funciona perfectamente, se suele considerar que es un mal diseño, especialmente en el ámbito universitario.

Eequiis
  • 1,807
  • 4
  • 19
  • Muchisimas gracias por toda tu explicación, me has ayudado mucho, ya que con los pocos recursos que recibo en clase se me hace muy difícil a veces entender muchos conceptos y funciones. Estoy teniendo un pequeño problema, en tu última solución al hacer la búsqueda correcta con el bucle while me lo hace bien, pero cuando pongo un valor que no existe en la array dni me sale un error como que ha intentado seguir buscando “Index 6 out of bounds for length” – Azumay404 Nov 02 '20 at 16:46
  • He llegado a esta posible solución: if (dni[i].equals(consulta)) System.out.println(alumnos[i] + " " + dni[i]); else break; } if(!dni[i].equals(consulta)){ System.out.println("No se ha encontrado"); } – Azumay404 Nov 02 '20 at 17:00
  • Tienes razón, por responder rápido cometí un error muy básico, que ocurre cuando se llega al último elemento y no es el que se busca en el vector. Editaré la respuesta. – Eequiis Nov 02 '20 at 17:07
  • La condición `i != dni.length` también la puedes escribir como `i < dni.length` para esta búsqueda. – Eequiis Nov 02 '20 at 17:11