[JAVA] Encontrar numeros repetidos en un array

  1. #1
    ForoParalelo: Miembro Avatar de zorex
    Registro
    24 nov, 13
    Mensajes
    858
    Me gusta (Dados)
    498
    Me gusta (Recibidos)
    223

    [JAVA] Encontrar numeros repetidos en un array

    Estoy haciendo un ejercicio en el que me dicen que muestre los numeros que se han introducido mas de una vez en un array. ¿Alguna idea?

    ¡Gracias!

  2. #2
    hehe xd Avatar de Furious
    Registro
    16 abr, 13
    Mensajes
    16,178
    Me gusta (Dados)
    7789
    Me gusta (Recibidos)
    4356

  3. #3
    AutoBanned Avatar de Usuario265211214
    Registro
    22 ago, 14
    Mensajes
    1,634
    Me gusta (Dados)
    640
    Me gusta (Recibidos)
    228
    No te voy a hacer los deberes pero te voy a dar una pista: variable que aumente un número natural cada vez que de una vuelta de bucle y que llame a esa posición determinada, dentro del bucle otro bucle mas que compare a uno con todos los demás mediante un lf

  4. #4
    ForoParalelo: Miembro Avatar de zorex
    Registro
    24 nov, 13
    Mensajes
    858
    Me gusta (Dados)
    498
    Me gusta (Recibidos)
    223
    Cita Iniciado por rbbdev Ver mensaje
    El mensaje está oculto porque el usuario está en tu lista de ignorados.
    No te voy a hacer los deberes pero te voy a dar una pista: variable que aumente un número natural cada vez que de una vuelta de bucle y que llame a esa posición determinada, dentro del bucle otro bucle mas que compare a uno con todos los demás mediante un lf
    Gracias por la pista. He hecho lo siguiente:

    //Pido 20 num al usuario

    int[] vector = new int[20];
    int num;
    for (int i = 0; i <= 19; i++) {
    System.out.print("Introduce un numero: ");
    vector[i]=sc.nextInt();

    //Dos bucles, para cada posicion compruebo las siguientes posiciones en el segundo bucle. Se que lo tengo mal, no me funciona, pero por mas que me como el coco no se hallar la solución

    }
    for (int i = 0; i <= 19; i++) {
    num=i+1;
    for (int j = num; j<=19; j++)
    if (num==vector[j]){
    System.out.println("Se repite el num: "+vector[j]);
    }
    }

    el num=i+1 lo pongo para que lo me compruebe el mismo numero de la misma posición.
    Última edición por zorex; 03/12/2014 a las 19:17

  5. #5
    ForoParalelo: Miembro Avatar de zorex
    Registro
    24 nov, 13
    Mensajes
    858
    Me gusta (Dados)
    498
    Me gusta (Recibidos)
    223
    Cita Iniciado por rbbdev Ver mensaje
    El mensaje está oculto porque el usuario está en tu lista de ignorados.
    No te voy a hacer los deberes pero te voy a dar una pista: variable que aumente un número natural cada vez que de una vuelta de bucle y que llame a esa posición determinada, dentro del bucle otro bucle mas que compare a uno con todos los demás mediante un lf
    Haz caso omiso a mi anterior mensaje, lo he conseguido de esta manera, ¿que te parece? Uso el "if (j!=i)" para que no me compare la misma posició y el "if (vector[i]!=vector[i-1]" para que no repita la comprobación del numero ya repetido.

    int[] vector = new int[20];
    int num;
    for (int i = 0; i <= 19; i++) {
    System.out.print("Introduce un numero: ");
    vector[i]=sc.nextInt();


    }
    for (int i = 0; i <= 19; i++) {
    for (int j = 0; j<=19; j++)
    if (j!=i){
    if (vector[i]==vector[j]){
    if (vector[i]!=vector[i-1]){
    System.out.println("Se repite el num: "+vector[j]);
    }
    }
    }
    }
    Última edición por zorex; 03/12/2014 a las 19:41

  6. #6
    AutoBanned Avatar de Usuario265211214
    Registro
    22 ago, 14
    Mensajes
    1,634
    Me gusta (Dados)
    640
    Me gusta (Recibidos)
    228
    Cita Iniciado por zorex Ver mensaje
    El mensaje está oculto porque el usuario está en tu lista de ignorados.
    Haz caso omiso a mi anterior mensaje, lo he conseguido de esta manera, ¿que te parece? Uso el "if (j!=i)" para que no me compare la misma posición.

    int[] vector = new int[20];
    int num;
    for (int i = 0; i <= 19; i++) {
    System.out.print("Introduce un numero: ");
    vector[i]=sc.nextInt();


    }
    for (int i = 0; i <= 19; i++) {
    for (int j = 0; j<=19; j++)
    if (j!=i){
    if (vector[i]==vector[j]){
    System.out.println("Se repite el num: "+vector[j]);
    }
    }
    }
    Luego lo miro pero parece bastante cortito, cosa buena en principio

  7. #7
    ForoParalelo: Miembro Avatar de zorex
    Registro
    24 nov, 13
    Mensajes
    858
    Me gusta (Dados)
    498
    Me gusta (Recibidos)
    223
    Cita Iniciado por rbbdev Ver mensaje
    El mensaje está oculto porque el usuario está en tu lista de ignorados.
    Luego lo miro pero parece bastante cortito, cosa buena en principio
    Hay una cosa que no consigo solucionar. Funciona, pero le falta un detalle. Cuando un numero lo ha comprobado, al volvérselo a encontrar repetido, vuelve a decir que está repetido. No se como hacer para que el numero que ya a visto que esta repetido, no lo vuelva a comprobar. A ver si cuando tengas un ratito me hechas un cable

  8. #8
    ForoParalelo: Miembro Avatar de micosil12
    Registro
    07 jun, 13
    Mensajes
    2,606
    Me gusta (Dados)
    111
    Me gusta (Recibidos)
    566
    Cita Iniciado por zorex Ver mensaje
    El mensaje está oculto porque el usuario está en tu lista de ignorados.
    Haz caso omiso a mi anterior mensaje, lo he conseguido de esta manera, ¿que te parece? Uso el "if (j!=i)" para que no me compare la misma posició y el "if (vector[i]!=vector[i-1]" para que no repita la comprobación del numero ya repetido.

    int[] vector = new int[20];
    int num;
    for (int i = 0; i <= 19; i++) {
    System.out.print("Introduce un numero: ");
    vector[i]=sc.nextInt();


    }
    for (int i = 0; i <= 19; i++) {
    for (int j = 0; j<=19; j++)
    if (j!=i){
    if (vector[i]==vector[j]){
    if (vector[i]!=vector[i-1]){
    System.out.println("Se repite el num: "+vector[j]);
    }
    }
    }
    }
    Utilizar dos bucles para este ejercicio me parece un poco excesivo, una alternativa es coger el array al usuario, ordenar los numeros del array y comparar si el numero i es igual al anterior (como estan ordenados los numeros iguales estaran en posiciones i y i+1):

    El array numeros es el array que el user nos pasa (que no se como se hace, en cualquier caso da igual el numero de numeros que haya en el array)

    Arrays.sort(numeros); // Los ordenamos para hacer la comparación que he comentado antes

    for(int i = 1; i < numeros.length; i++) { // recorremos todo el array
    if(numeros[i] == numeros[i - 1]) { // Comparamos si i es igual a su anterior
    System.out.println("Se repite el num: " + numeros[i]); // mostramos en pantalla
    }
    }
    Última edición por micosil12; 03/12/2014 a las 20:01

  9. #9
    ForoParalelo: Miembro Avatar de zorex
    Registro
    24 nov, 13
    Mensajes
    858
    Me gusta (Dados)
    498
    Me gusta (Recibidos)
    223
    Cita Iniciado por micosil12 Ver mensaje
    El mensaje está oculto porque el usuario está en tu lista de ignorados.
    Utilizar dos bucles para este ejercicio me parece un poco excesivo, una alternativa es coger el array al usuario, ordenar los numeros del array y comparar si el numero i es igual al anterior (como estan ordenados los numeros iguales estaran en posiciones i y i+1):

    El array numeros es el array que el user nos pasa (que no se como se hace, en cualquier caso da igual el numero de numeros que haya en el array)

    Arrays.sort(numeros); // Los ordenamos para hacer la comparación que he hecho antes

    for(int i = 1; i < numeros.length; i++) { // recorremos todo el array
    if(numeros[i] == numeros[i - 1]) { // Comparamos si i es igual a su anterior
    System.out.println("Se repite el num: " + numeros[i]); // mostramos en pantalla
    }
    }
    Efectivamente, funciona ordenándolos antes, no se me había ocurrido

  10. #10
    ForoParalelo: Miembro Avatar de micosil12
    Registro
    07 jun, 13
    Mensajes
    2,606
    Me gusta (Dados)
    111
    Me gusta (Recibidos)
    566
    Añadimos la funcionalidad que has comentado (que no se repitan), nos ayudamos de un array vacio en el que meteremos los numeros repes:

    Arrays.sort(numeros); // Los ordenamos para hacer la comparación que he comentado antes
    int[] repes; //Desconozco si en java le tienes que decir que tamaño tiene que tener
    int k = 0; // Contador
    for(int i = 1; i < numeros.length; i++) { // recorremos todo el array
    if(numeros[i] == numeros[i - 1]) { // Comparamos si i es igual a su anterior
    if (!Arrays.asList(repes).contains(i)){ // Añadimos la funcionalidad de no imprimir numeros que ya
    System.out.println("Se repite el num: " + numeros[i]); // mostramos en pantalla
    repes[k] = i;
    k++;
    }
    }
    }

    Revisa las declaraciones ya que no tengo ni idea de como se declara en java.

  11. #11
    FP never forget~ Avatar de Zap2x
    Registro
    28 abr, 14
    Ubicación
    Central Eléctrica
    Mensajes
    4,365
    Me gusta (Dados)
    2544
    Me gusta (Recibidos)
    1298
    No se demasiado de java, pero podrías tener un array de pairs (si es que en java se podían hacer), es decir, para cada posición del array tendrás el número y un booleano que te indicará si se ha repetido más de una vez o no, y que para cada número que introduzcas mire si ya está metido, si no lo está pones el booleano a true y así sabrás que ese número está repetido almenos una vez.
    Si además lo metes en una estructura como una cola de prioridad o simplemente llamas a alguna función para que te lo ordene puedes usar una búsqueda dicotómica para reducir considerablemente el tiempo de búsqueda.

    Pero no sé cuál es tu nivel de programación

  12. #12
    ForoParalelo: Miembro Avatar de zorex
    Registro
    24 nov, 13
    Mensajes
    858
    Me gusta (Dados)
    498
    Me gusta (Recibidos)
    223
    Cita Iniciado por Zap2x Ver mensaje
    El mensaje está oculto porque el usuario está en tu lista de ignorados.
    No se demasiado de java, pero podrías tener un array de pairs (si es que en java se podían hacer), es decir, para cada posición del array tendrás el número y un booleano que te indicará si se ha repetido más de una vez o no, y que para cada número que introduzcas mire si ya está metido, si no lo está pones el booleano a true y así sabrás que ese número está repetido almenos una vez.
    Si además lo metes en una estructura como una cola de prioridad o simplemente llamas a alguna función para que te lo ordene puedes usar una búsqueda dicotómica para reducir considerablemente el tiempo de búsqueda.

    Pero no sé cuál es tu nivel de programación


    Estoy cursando primero de DAM (Ciclo superior de desarrollo de aplicaciónes multiplataforma), y estoy en primer curso .

    Sobre lo que dices,

  13. #13
    FP never forget~ Avatar de Zap2x
    Registro
    28 abr, 14
    Ubicación
    Central Eléctrica
    Mensajes
    4,365
    Me gusta (Dados)
    2544
    Me gusta (Recibidos)
    1298
    Cita Iniciado por zorex Ver mensaje
    El mensaje está oculto porque el usuario está en tu lista de ignorados.


    Estoy cursando primero de DAM (Ciclo superior de desarrollo de aplicaciónes multiplataforma), y estoy en primer curso .

    Sobre lo que dices,
    Bueno, es algo complejo si estás en primero
    Pero no pasa nada, dale calor

  14. #14
    ForoParalelo: Miembro Avatar de peter88
    Registro
    17 oct, 14
    Mensajes
    455
    Me gusta (Dados)
    65
    Me gusta (Recibidos)
    56
    Cita Iniciado por zorex Ver mensaje
    El mensaje está oculto porque el usuario está en tu lista de ignorados.
    Estoy haciendo un ejercicio en el que me dicen que muestre los numeros que se han introducido mas de una vez en un array. ¿Alguna idea?

    ¡Gracias!
    si no lo has solucionado, ahi esta.
    en las pruebas que hice funciono, igual se puede reducir codigo pero creo que asi esta bien.


  15. #15
    AutoBanned Avatar de Usuario335120615
    Registro
    13 oct, 14
    Ubicación
    dentro de tu biega
    Mensajes
    2,516
    Me gusta (Dados)
    449
    Me gusta (Recibidos)
    1330
    No puedo creer que sea más eficiente hacer el ejercicio en php que en java

    Para plantearlo de otra forma te doy pistas:

    - clonas el array
    - en el array clonado buscas los elementos únicos
    - guardas en un array la resta del original y el clonado
    - sacas los elementos únicos del array resultante

    el método equals() es tu amigo


    Otra opción más compacta que también sirve:
    - recorres el array haciendo Set hacia un nuevo array
    - como con Set no se repiten elementos, puedes evaluar si se ha devuelto true o false al hacerlo
    - si es un false, guardas el elemento en un nuevo array


    Este te lo escribo para que lo entiendas, a ver si me acuerdo de java:

    Código:
    public static ArrayList buscarDuplicados(int[] shurnumeros) {
            Set edefakiel = new HashSet();
            Set tania = new int[];
            for (int shurnumero : shurnumeros) {
                if (!edefakiel.add(shurnumero)) {
                    tania.add(shurnumero);
                }
            }
            return tania;
        }
    Perdón si tengo alguna cagada, pero hace eones que no toco java. Espero que te sirva la idea



    Última edición por Usuario335120615; 04/12/2014 a las 10:31

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •