Pregunta

Estoy intentando escribir un pequeño programa que imprima números distintos en una matriz.Por ejemplo, si un usuario ingresa 1,1,3,5,7,4,3, el programa solo imprimirá 1,3,5,7,4.

Recibo un error en la línea else if de la función checkDuplicate.

Aquí está mi código hasta ahora:

import javax.swing.JOptionPane;

public static void main(String[] args) {
    int[] array = new int[10];
    for (int i=0; i<array.length;i++) {
        array[i] = Integer.parseInt(JOptionPane.showInputDialog("Please enter"
                                  + "an integer:"));
    }
    checkDuplicate (array);
}

public static int checkDuplicate(int array []) {
    for (int i = 0; i < array.length; i++) {
        boolean found = false;
        for (int j = 0; j < i; j++)
            if (array[i] == array[j]) {
                found = true;
                break;
            }
        if (!found)
            System.out.println(array[i]);
    }
    return 1;
}
}
¿Fue útil?

Solución

En primer lugar, el "else if" afirmación es incorrecta, ya que no proporciona ninguna condición para el caso (si quieres un caso, tiene que escribir "if (condition) ...").

En segundo lugar, no se puede decidir en el interior del bucle interno , si un valor debe ser impreso: La forma en que funciona el código que escriba una matriz de valores [i] para cada matriz de valores [j] que es diferente de array [i]!

Tercero: el bucle interior sólo tiene que ir de 0 al índice exterior i-1: Para cada elemento, sólo tiene que decidir, si es la primera ocurrencia (es decir, si el mismo valor se produjo a cualquier índice anterior o no). Si es así, imprimirlo, si no, lo ignoran.

Una aplicación adecuada de CheckDuplicate() sería:

public static void checkDuplicate(int array []) {
  for (int i = 0; i < array.length; i++) {
    boolean found = false;
    for (int j = 0; j < i; j++)
      if (array[i] == array[j]) {
        found = true;
        break;
      }
    if (!found)
      System.out.println(array[i]);
  }
}

Pero, por supuesto, algún tipo de Set sería mucho más eficiente para las matrices más grandes ...


EDIT: Por supuesto, mmyers (ver comentarios) que es correcto al decir, que desde void no devuelve ningún valor, se debe tener el tipo de retorno int (en lugar de <= >). He corregido esto en el código anterior ...

Otros consejos

La forma más sencilla sería agregar todos los elementos a un Set<Integer> y luego simplemente imprima el contenido del Set.

Póngalos en un conjunto ordenado por el tiempo de inserción, a continuación, convertir de nuevo a una matriz si es necesario.

new LinkedHashSet<Integer>(array).toArray()

Trate de lanzar todos los números enteros en un conjunto. Los duplicados no será nunca añaden al conjunto y se le dejó tendrán un conjunto de números enteros únicos.

Lo que se quiere se puede lograr utilizando Java API de colección, pero no exactamente como una sola línea, debido al hecho de métodos de recolección de trabajar con Object s y no primitivas. J2SE carece de métodos que convierten, por ejemplo, a int[] Integer[], pero Apache Commons Lang biblioteca contiene tales métodos útiles, como ArrayUtils.toObject () y ArrayUtils.toPrimitive () .

Su uso, método para eliminar elementos duplicados de una matriz de enteros se ve algo como esto:

public static int[] removeDuplicates(int... array) {
    Integer[] ints = ArrayUtils.toObject(array);
    Set<Integer> set = new LinkedHashSet<Integer>(Arrays.asList(ints));
    return ArrayUtils.toPrimitive(set.toArray(new Integer[set.size()]));
}

Si su aplicación es probable que incluya más de la matriz / manipulación de colección, le sugiero que tome un vistazo a esa biblioteca, en lugar de aplicar las cosas desde cero. Pero, si lo estás haciendo con fines de aprendizaje, el código de distancia!

Probablemente sería mejor añadir cada número a un conjunto aplicación en lugar de una matriz. Los conjuntos son específicamente para el almacenamiento de colecciones de elementos en la que desea filtrar los duplicados.

O bien utilizar un conjunto como otras personas han sugerido o utilizar una Lista de clase compatibles. Con una clase compatible lista sólo tiene que utilizar el método contiene para comprobar si ya existe en la matriz.

java.util.Scanner importación; PrintDistinctNumbers clase pública {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    int [] numberArray = createArray();
    System.out.println("The number u entered are:   ");
    displayArray(numberArray);
    getDistinctNumbers(numberArray);
}

public static int[] createArray() {
    Scanner input = new Scanner(System.in);
    int [] numberCollection = new int [10];
    System.out.println("Enter 10 numbers");

    for(int i = 0; i < numberCollection.length; i++){
        numberCollection[i] = input.nextInt();
    }
    return numberCollection;

}

public static void displayArray(int[] numberArray) {
    for(int i = 0; i < numberArray.length; i++){
        System.out.print(numberArray[i]+" ");
    }
}

public static void getDistinctNumbers(int[] numberArray) {
    boolean isDistinct = true;
    int temp = 0;
    int [] distinctArrayNumbers = new int [10];
    for ( int i = 0; i < numberArray.length; i++){
        isDistinct = true;
            temp = numberArray[i];

            for( int j = 0; j < distinctArrayNumbers.length; j++){
                if( numberArray[i] == distinctArrayNumbers[j] ){
                isDistinct = false;
            }


           }
            if(isDistinct){
                    distinctArrayNumbers[temp]=numberArray[i];
                    temp++;
                }


    }
    displayDistinctArray(distinctArrayNumbers);
}

public static void displayDistinctArray(int[] distinctArrayNumbers) {
    for( int i = 0; i < distinctArrayNumbers.length; i++){
        if(distinctArrayNumbers[i] != 0){
        System.out.println(distinctArrayNumbers[i]);
        }
    }
}

}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top