Pergunta

Eu estou tentando escrever um pequeno programa que imprime números distintos em uma matriz. Por exemplo, se um usuário digita 1,1,3,5,7,4,3 o programa só irá imprimir 1,3,5,7,4.

Estou recebendo um erro na else if linha no checkDuplicate função.

Aqui está o meu código até agora:

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;
}
}
Foi útil?

Solução

Em primeiro lugar, a afirmação "else if" é incorreta, já que você não fornecer qualquer condição ao se (se você quer um caso, você precisa escrever "if (condition) ...").

Em segundo lugar, você não pode decidir dentro do loop, se um valor deve ser impresso interior: A forma como o código funciona você escreve uma matriz valor [i] para cada matriz valor [j] que é diferente do array [i]!

Em terceiro lugar: o loop interno só precisa ir de 0 a i-1 índice exterior: Para cada elemento, você só precisa decidir, se for a primeira ocorrência (ou seja, se o mesmo valor ocorreu a qualquer índice anterior ou não) . Se for, imprimi-lo, se não, ignorá-lo.

A aplicação adequada da CheckDuplicate() seria:

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]);
  }
}

Mas, claro, algum tipo de Set seria muito mais eficiente para arrays maiores ...


EDIT: Claro, mmyers (ver comentários) está certo ao dizer que, desde CheckDuplicate() não retorna qualquer valor, ele deve ter tipo de retorno void (em vez de int). Eu corrigi isso no código acima ...

Outras dicas

A maneira mais simples seria a de adicionar todos os elementos para uma Set<Integer> e depois é só imprimir o conteúdo do Set.

Coloque-as em um conjunto ordenado pelo tempo de inserção, em seguida, converter de volta para uma matriz, se necessário.

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

Tente jogando todos os números inteiros em um Set. Duplicatas nunca vai ser adicionado ao jogo e você será deixado será um conjunto de inteiros únicos.

O que você quer pode ser realizada utilizando Java coleta de API, mas não exatamente como um one-liner, devido ao fato de métodos de coleta de trabalhar com Objects e não primitivas. J2SE carece de métodos que converso, digamos, int[] para Integer[], mas Apache Commons Lang biblioteca contém tais métodos úteis , como ArrayUtils .toObject () e ArrayUtils.toPrimitive () .

Usando eles, método para remover elementos duplicados a partir de uma matriz de inteiros é algo como isto:

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()]));
}

Se o seu aplicativo é provável que incluem mais de manipulação de matriz / coleta, eu sugiro que você dê uma olhada nessa biblioteca, em vez de implementar as coisas a partir do zero. Mas, se você está fazendo isso para fins de aprendizagem, código de distância!

Ele provavelmente seria melhor para adicionar cada número a uma Set implementação, em vez de uma matriz. Sets são especificamente para armazenar coleções de elementos em que pretende filtrar duplicatas.

Utilize uma Definir como outras pessoas têm sugerido ou usar uma lista de classe compatível. Com uma lista de classe compatível apenas usar o método Contém para verificar se ele já existe na matriz.

java.util.Scanner importação; PrintDistinctNumbers classe 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top