Java - No repetir numeros de un arreglo

 
Vista:

No repetir numeros de un arreglo

Publicado por anonimo (1 intervención) el 30/08/2019 19:54:16
Hola tengo un problema, como hacer que no se repitan los numeros en el arreglo, es decir...
Necesito hacer que el usuario digite la cantidad de numeros y si estan repetidos mande un mensaje Ejemplo"El dato 5 ya se encuentra en la posicion 0" Gracias por su colaboracion

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static void main(String[] args) {
        Scanner lector = new Scanner(System.in);
        boolean band = true;
        while (band == true) {
            System.out.println("ingrese el numero de elementos: ");
            int n = lector.nextInt();
            System.out.println("Comience!!!");
            int[] Arreglo = new int[n];
 
            for (int i = 0; i < n; i++) {
 
                Arreglo[i] = lector.nextInt();
 
                if (i!=  i) {
                    System.out.println("Ya se encuentra en la posicion" + i);
                } else {
                 band=false;
 
                }
 
            }
        }
    }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

No repetir numeros de un arreglo

Publicado por Kabuto (1381 intervenciones) el 30/08/2019 21:14:22
Hola.

Si te paras a pensarlo mejor, te darás cuenta de que este condicional no tiene sentido:

1
if (i!= i)

Una variable no puede tener dos valores distintos al mismo tiempo. Si i = 5, el 5 es su valor y no otro.
Por tanto, una variable concreta siempre va a ser igual a sí misma, es imposible que la i sea distinta de i, porque si tiene valor 5, es imposible que el 5 sea distinto de 5...
En resumen, preguntar si la i es distinta de i, no sirve para nada, porque es algo que jamás ocurrirá.

Al margen de esto.
Para este ejercicio se necesitarán dos bucles. Uno para pedir números al usuario. El otro bucle, que será interno, se encargará de comprobar si el número ingresado está repetido o no, para decidir si lo podemos aceptar.

Puesto que cabe la posibilidad de que rechacemos algunos números insertados, para controlar en que posición hay que insertar los números necesitaremos una variable "índice" que no aumente su valor en cada repetición del bucle, sino que solo aumente cuando hayamos comprobado que el número no está repetido y podemos aceptarlo.
Para esto es mejor usar una variable int que iremos incrementando manualmente cuando queramos, y no el típico valor i que usamos en los bucles for.

Usaremos un bucle for, pero solo para recorrer los números ingresados anteriormente y comprobar si el número actual está repetido. Pero el indice i de este for no nos dirá en que posición del arreglo hay que insertar el número aceptado, esto nos lo dirá la variable que declararemos por separado.

Te pongo un código con varios comentarios explicando casi cada línea. Si algo no lo entiendes pregunta.
Al final de todo, uso un "for each" para mostrar los valores aceptados en el arreglo. Este bucle es un poco distinto al for habitual, no se si lo conoces ya. En caso contrario, dilo y lo explicamos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class SinRepetir {
 
	public static void main(String[] args) {
 
		Scanner lector = new Scanner(System.in);
 
		System.out.print("¿Cuántos números quiere ingresar?: ");
 
		int[] numeros = new int[lector.nextInt()];
 
		int indice = 0; //Aquí controlamos en que posicion del arreglo debemos insertar
						//el número ingresado por el usuario.
		while (indice < numeros.length) {
			//Pedimos un número
			System.out.print("Ingrese número: ");
			int numero = lector.nextInt();
			/*
			 * Tenemos número, hay que comprobar si ya existe.
			 * No es necesario recorrer el arreglo hasta el final,
			 * solo hay que recorrerlo hasta la posición indicada por
			 * la variable "indice", ya que en las posiciones siguientes a
			 * "indice" aún no hemos introducido números.
			 */
			boolean aceptado = true; //Si descubrimos que el número está repetido, adoptará valor false
			//Comprobamos si está repetido
			for (int i = 0; i < indice; i++) {
				if (numeros[i] == numero)  { //¡Número repetido!!
					aceptado = false; //No podemos aceptarlo
					//Informamos al usuario.
					System.out.println("El número " + numero + " ya existe en posición: " + i);
				}
			}
			//Bucle de comprobación finalizado, a ver que ha descubierto
			if (aceptado) {//El número ha sido aceptado, porque NO está repetido
				numeros[indice] = numero; //Lo guardamos donde nos diga el "indice"
				indice++; //Aumentamos "indice" para la próxima iteración del bucle.
			}
		}
 
		//Fin de la inserción de datos, mostramos el arreglo
		lector.close();
		System.out.println("\nInserción finalizada. Estos son los números ingresados:");
		for (int numero: numeros) {
			System.out.print(numero + " ");
		}
	}
 
}

Y este es el resultado por consola:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
¿Cuántos números quiere ingresar?: 10
Ingrese número: 10
Ingrese número: 23
Ingrese número: 45
Ingrese número: 10
El número 10 ya existe en posicion: 0
Ingrese número: 23
El número 23 ya existe en posicion: 1
Ingrese número: 89
Ingrese número: 22
Ingrese número: 67
Ingrese número: 22
El número 22 ya existe en posicion: 4
Ingrese número: 88
Ingrese número: 11
Ingrese número: 16
Ingrese número: 45
El número 45 ya existe en posicion: 2
Ingrese número: 9
 
Inserción finalizada. Estos son los números ingresados:
10 23 45 89 22 67 88 11 16 9
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

No repetir numeros de un arreglo

Publicado por Billy Joel (876 intervenciones) el 31/08/2019 00:47:58
Parece que tuvimos la misma idea, pero en lugar de usar un while + for; yo utilicé dos fors

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.print("ingrese el numero de elementos: ");
    int[] elementos = new int[sc.nextInt()];
    for (int i = 0; i < elementos.length; i++) {
        System.out.print("ingrese el numero para la posicion [" + i + "]: ");
        int e = sc.nextInt();
        Integer posicion = null;
        for (int j = 0; j < i; j++) {
            if (e == elementos[j]) {
                posicion = j;
                break;
            }
        }
        if (posicion == null) {
            elementos[i] = e;
        } else {
            System.out.println("El elemento " + e + " ya se encuentra en la posicion " + posicion + " del arreglo");
            i--;
        }
    }
    System.out.print("Inserción finalizada. Estos son los números ingresados: [");
    for (int i = 0; i < elementos.length; i++) {
        System.out.print(elementos[i] + (i + 1 < elementos.length ? ", " : "]\n"));
    }
}

Saludos,
Billy Joel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

No repetir numeros de un arreglo

Publicado por Kabuto (1381 intervenciones) el 31/08/2019 19:27:37
Genial, dos formas distintas de resolver el enunciado.

La mayoría de las veces se puede conseguir lo mismo usando distintos tipos de bucles. Solo cambia un poco la lógica del código.

En mi caso, usando el while, tengo que incrementar el índice manualmente cuando acepto un número.
En tu caso, con el for, tienes que decrementar el índice manualmente cuando lo rechazas.

Tanto monta, monta tanto...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No repetir numeros de un arreglo

Publicado por jhon esteban (1 intervención) el 20/04/2021 21:07:47
puedes hacer esta representación con el programa dfd o abría algún inconveniente con las variables?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar