Estoy tratando de escribir un código que se encuentra el valor duplicado en una matriz. Así que, ahora que he escrito a continuación el código:

public static void main(String[] args) {
        //TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        //System.out.println("Please enter the length of Array: ");
        int[] array = new int[6];
        for(int i =0; i<array.length;i++) {
            System.out.println("Enter value for index "+i+":");
            array[i] = sc.nextInt();
            }

        FindDuplicateInArray obj = new FindDuplicateInArray();

        obj.findDupicateInArray(array);
    }

    public void findDupicateInArray(int[] a) {
        //int pointer = a[0];
        int count=0;
        for(int j=0;j<a.length;j++) {
            for(int k =j+1;k<a.length;k++) {
                if(a[j]==a[k] && j!=k && j<k && count<=1) {
                    count++;
                    if(count==1)
                    System.out.println(a[j]);

                }

            }


        }

    }

Pero no estoy obteniendo los resultados esperados, por ejemplo:

  1. Si me dan valor 1,2,1,4,3,1, a continuación, que se ha de encontrar el valor duplicado 1.

  2. Pero si me ofrecen 2 ajuste de valor duplicado en una matriz, todavía es encontrar el primer duplicado.
    por ejemplo, 1,2,1,2,1,3. Es dar salida sólo 1.

He encontrado la razón de resultado incorrecto, que es condición del conde es decir, el recuento es de más de 1 y no es coincidente con la primera condición if.

Así, he intentado restablecer el contador a 0 después de una iteración del bucle, ahora se está dando a todos los duplicados de los valores, pero los valores duplicados se imprima dos veces.

public static void main(String[] args) {
        //TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        //System.out.println("Please enter the length of Array: ");
        int[] array = new int[6];
        for(int i =0; i<array.length;i++) {
            System.out.println("Enter value for index "+i+":");
            array[i] = sc.nextInt();
            }

        FindDuplicateInArray obj = new FindDuplicateInArray();

        obj.findDupicateInArray(array);
    }

    public void findDupicateInArray(int[] a) {
        //int pointer = a[0];
        int count=0;
        for(int j=0;j<a.length;j++) {
            for(int k =j+1;k<a.length;k++) {
                if(a[j]==a[k] && j!=k && j<k && count<=1) {
                    count++;
                    if(count==1)
                    System.out.println(a[j]);

                }

            }
            **count = 0;**

        }

    }

por ejemplo, de Entrada: 1,2,1,2,1,2, Salida: 1 2 1 2

Por favor, sugiera cómo obtener el resultado correcto.

  • Bienvenido a Desbordamiento de Pila! Parece que usted necesita para aprender a utilizar un depurador. Por favor, ayudar a usted a algunos complementarias técnicas de depuración. Si usted todavía tiene problemas después, por favor siéntase libre de venir de vuelta con una más pregunta específica.
InformationsquelleAutor Shan | 2017-09-26

4 Comentarios

  1. 2

    Usted está en el camino correcto, me acaba de actualizar su método, espero que se entienda lo que fue su error:

    public void findDupicateInArray(int[] a) {
            int count=0;
            for(int j=0;j<a.length;j++) {
                for(int k =j+1;k<a.length;k++) {
                    if(a[j]==a[k]) {
                        count++;
                    }
                }
                if(count==1)
                   System.out.println(a[j]);
                count = 0;
            }
        }

    Sin embargo, esto hará que el código se ejecute correctamente, y eso no significa que usted ha escrito el óptimo código.

    • Gracias por esto, esto me está dando el resultado correcto, pero el si en el caso de que me va a proporcionar la entrada: 1,2,1,2,1,3, entonces se dará la salida en el orden de 2 de 1 & 1 2. Puedo llegar a saber la razón por la que si iniciales de iteraciones se hará el recuento mayor que 1 y, a continuación, imprimir el valor de j de la última iteración. Pero es posible imprimir el valor en el orden de 1 2 en lugar de 2 1?
    • Sí, es posible, ya sea que lo primero ordenar la matriz y el uso de esta función para encontrar el duplicado o recoger la duplicación de los valores de la matriz y ordenar e imprimir.
  2. 3

    No me gusta el uso de los Arroyos o algo alto nivel para la solución de algorythmic problema; sólo por la simple java. Así que esta es mi solución:

    public static Set<Integer> findDuplicateInArray(int... arr) {
        Set<Integer> unique = new HashSet<>();
        Set<Integer> duplicate = new HashSet<>();
    
        for (int val : arr)
            (unique.contains(val) ? duplicate : unique).add(val);
    
        return duplicate;
    }

    En caso de que usted es capaz de modificar incomming arr, a continuación, con algunas pequeñas modificaciones, puede refuce de Set<Integer> unique.

  3. 2

    Tal vez es más fácil para convertir la matriz a de la lista y hacer que toda la lógica con el Java 8 flujos de api en una frase:

            Integer[] numbers = new Integer[] { 1, 2, 1, 2, 1, 3 };
        List<Integer> listInteger = Arrays.asList(numbers);         
        listInteger.stream().filter(i -> Collections.frequency(listInteger, i) >1).collect(Collectors.toSet()).forEach(System.out::println);

    Salida

    1
    2
  4. 0

    Por favor, eche un vistazo en el código de abajo le ayudará.

    Que tiene que contar el número de repeatation de cada elemento y, a continuación, en la última encontrar el conde, el cual le indicará el duplicado de la nos.

        package com.java;
    import java.util.Arrays;
    import java.util.LinkedHashMap;
    import java.util.LinkedHashSet;
    import java.util.Map;
    import java.util.Set;
    public class FindDuplicateInArray {
    public static void main(String[] args) {
    int[] intArr = new int[] { 1, 2, 1, 2, 1, 3, 4, 6, 2, 8 };
    Map<Integer, Integer> map = new LinkedHashMap<Integer, Integer>();
    for (int i = 0; i < intArr.length; i++) {
    //take first element and then matched complete array
    int temp = intArr[i];
    int count = 0;
    for (int j = 0; j < intArr.length; j++) {
    if (temp == intArr[j]) {
    //element matched -- break
    count++;
    }
    }
    map.put(temp, count);
    }
    Set<Integer> duplicate = new LinkedHashSet<Integer>();
    Set<Integer> noDuplicate = new LinkedHashSet<Integer>();
    for (int i = 0; i < intArr.length; i++) {
    if (map.containsKey(intArr[i])) {
    System.out.println("Key :" + intArr[i] + " Value : " + map.get(intArr[i]));
    if (map.get(intArr[i]) > 1) {
    //means repeated character
    duplicate.add(intArr[i]);
    } else {
    //non repeated character
    noDuplicate.add(intArr[i]);
    }
    }
    }
    System.out.println("Duplicate Chars : " + Arrays.toString(duplicate.toArray()));
    System.out.println("No Duplicate Chars : " + Arrays.toString(noDuplicate.toArray()));
    }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here