Verficar duplicata num array unidimensional

8 respostas
S

Olá, Boa Dia!

Estou com um probleminha : o programa recebe uma entrada de 20 números entre 10 e 100, verifica se se não há números repetidos (duplicata), em seguida exibe apenas aqueles para os quais NÃO haja duplicata. No final, exibe os valores únicos inseridos.
O problema está exatamente nas comparções não consigo constuir o algoritmo de forma que se saiba os valores duplicados.

Segue o código abaixo para que alguém possa me auxilar, se possível:

import java.util.*;
import javax.swing.JOptionPane;

public class Main {

private static int TAMANHO = 20;

public static void main( String args[] ) {

int[] numeros= new int[TAMANHO];
int entrada=0;

for(int i = 0; i < TAMANHO; i++){

String s=JOptionPane.showInputDialog(null, “Digite um número entre 10 e 100:”);
entrada = Integer.parseInt(s);

if (entrada!=numeros[i]){

numeros[i]=entrada;

JOptionPane.showMessageDialog(null, +numeros[i] + " não possui duplicata."); }else{

JOptionPane.showMessageDialog(null, +numeros[i] + possui duplicata.);

i++; }

while (entrada < 10 || entrada > 100){

s=JOptionPane.showInputDialog(null, Entrada Inválida. Digite um número entre 10 e 100:”);

numeros[i]= Integer.parseInt(s);

}

}
JOptionPane.showMessageDialog(null,"Números digitados : " + java.util.Arrays.toString(numeros));

System.exit(0);

}

}

Desde já fico muito grata!

8 Respostas

M

Você tem que, obrigatoriamente, utilizar um array?

D

Você quer verificar na inserção ou só na hora de exibir?

Supondo que o array já esteja populado pelos números:

int cont = 0;

for ( int i = 0; i < array.length; i++ ) {
    for ( int j = 0; j < arrayl.legth; j++ ) {

        // contando a quantidade de ocorrências
        if ( array[ i ] == array[ j ] )
            cont++;

        // se tiver mais de um, reseta contador e quebra o for interno
        if ( cont > 1 ) {
            cont = 0;
            break;
        }

    }
    
    // se existe apenas uma ocorrência...
    if ( cont == 1 )
        System.out.println( array[ i ] );
}

Caso queira fazer a verificação na entrada vc vai precisar fazer todo esse percurso, e caso haja nenhum ocorrência vc insere no array.

Num é um exemplo de performance, mas para arrays pequenos dá pro gasto.

Vc poderia implementar uma busca binária, ou mesmo utilizar os métodos da classe java.util.Arrays para fazer ordenação e pesquisa para você, mas não me parece q seja esse o objetivo do seu exercício. O lance é fazer na unha mesmo né? Assim dá pro gasto hehe

Falow!

S

Obrigatoriamente!
rsrsrsrsrrs
E tem que ser com o menor array possível, portanto, suponho que devo ter uma variável do tipo inteiro e um array para depositar os valores não duplicados!

Abçs!

P

Dica: Ordene o seu array!

Esta pode ser uma forma:
vetor_recebido
vetor_final

Arrays.sort(vetor_recebido)

total = 0;
vetor_final[total] = vetor_recebido[0];

for(int i=1;i< 20;i++){
  if (vetor_recebido[i-1] != vetor_recebido[i]) {
    total++;
    vetor_final[total] = vetor_recebido[i];
  } 
}
for(int i=0;i<total;i++){
   System.out.println(vetor_final[i]);
}
M

Vamos ver alguns pontos:
Primeiro: Do jeito que tá seu programa, o primeiro número que o usuário informar poderá estar fora do intervalo [10;100].
Segundo: quando você supostamente detecta que o usuário entrou com um valor repetido, você aumenta o contador. Creio que o que você queria era diminuir o contador, não é?
Terceiro: não é muito “legal” altar uma variável de controle utilizada pelo for. Isso costuma nos levar a erros na lógica do programa, difíceis de detectar.
Quarto: Você está assumindo que quando a condição “entrada != numeros[i]” é verdadeira, quer dizer que o usuário está entrando com um valor não-repetido. Isto não é, necessariamente, verdade. O que esta condição está verificando é apenas se o i-ésimo elemento do array numeros é diferente do número informado pelo usuário (entrada). Perceba que isto sempre será verdadeiro, uma vez que
[list]Quando um array de int é instanciado, todos os seus elementos são setados para o valor 0[/list]
[list]A lógica do seu programa, teoricamente, não permite que seja entrado nenhum valor menor que 10[/list]
O que você deve fazer é verificar se cada entrada já não foi “armazenada” em alguma das posições do array. Ou seja, a cada entrada, você terá que varrer o array e verificar se a nova entrada não aprece no array.
Tendo estes pontos que eu citei em mente, tente refazer seu programa, e em caso de dúvida, poste novamente aqui, ok?
Divirta-se!

S

Mantu:
Vamos ver alguns pontos:
Primeiro: Do jeito que tá seu programa, o primeiro número que o usuário informar poderá estar fora do intervalo [10;100].
Segundo: quando você supostamente detecta que o usuário entrou com um valor repetido, você aumenta o contador. Creio que o que você queria era diminuir o contador, não é?
Terceiro: não é muito “legal” altar uma variável de controle utilizada pelo for. Isso costuma nos levar a erros na lógica do programa, difíceis de detectar.
Quarto: Você está assumindo que quando a condição “entrada != numeros[i]” é verdadeira, quer dizer que o usuário está entrando com um valor não-repetido. Isto não é, necessariamente, verdade. O que esta condição está verificando é apenas se o i-ésimo elemento do array numeros é diferente do número informado pelo usuário (entrada). Perceba que isto sempre será verdadeiro, uma vez que
[list]Quando um array de int é instanciado, todos os seus elementos são setados para o valor 0[/list]
[list]A lógica do seu programa, teoricamente, não permite que seja entrado nenhum valor menor que 10[/list]
O que você deve fazer é verificar se cada entrada já não foi “armazenada” em alguma das posições do array. Ou seja, a cada entrada, você terá que varrer o array e verificar se a nova entrada não aprece no array.
Tendo estes pontos que eu citei em mente, tente refazer seu programa, e em caso de dúvida, poste novamente aqui, ok?
Divirta-se!

Olá!

Obrigada pelas dicas bem esclarecedoras, mas continuo com dúvidas quanto ao " varrer do array " em busca de entradas repetidas.
O resto do código todo funciona bem ( PS: a entrada é entre 10 e 100 mesmo, inclusive), mas na hora de verificar os valores repetidos, ele só está verificando o imediatamente anterior. Também pudera, pois a única forma que consegui pra funcionar mais ou menos é a que segue abaixo:

if (entrada==numeros[i-1]) {

duplicata=true;

JOptionPane.showMessageDialog(null, +entrada + " Possui duplicata na posição: " +i);

numeros[i]=entrada;

}

if (entrada!=numeros[i-1]){

duplicata=false;

JOptionPane.showMessageDialog(null, +entrada + " Não possui duplicata.");

numeros[i]=entrada;

}

Eu não tenho que comparar dois arrays, mas verificar se uma entrada do usuário já existe no array; se sim, excluo a variável; se não, adiciono-a
. No final, o programa exibe a relação de números únicos inseridos, ! Mas tudo empaca na “varredura”!rsrsrsr

Oh, my God!

M

Sara Teles:

Oh, my God!

Vamos deixar o Velinho fora dessa, né? Que ele já deve estar atolado de chamdos… :lol:
Bom, então você está com problemas em varrer o vetor(o array), certo? Um vetor é uma coleção de dados de mesmo tipo. É como se você tivesse uma caixinha com vários compartimentos, e em cada compartimento cabe apenas um dado de um determinado tipo. Um exemplo prático de um vetor seria aqueles porta cds:

Se você quer procurar, por exemplo, pelo CD “Retrospectacle” do Supertramp, normalmente você vai olhar de cima para baixo (do começo ao fim) até encontrar o CD ou até chegar ao fim do porta CD. Em outras palavras, você vai varrer o porta cd em busca do “Retrospectacle”.
Agora, vamos supor que você está fazendo aniversário, e que é uma pessoa meio “estranha”, que devolve presentes repetidos: “Ah, brigada, mas eu ja tenho isso!” :? :lol:
Eis que você ganha o CD “As Cidades” do Chico. Bom, você não sabe de cabeça se já tem ou não esse CD, então você sabe que vai ter que varrer a sua coleção de CDs para ver se nela já existe o “As Cidades”. Inicialmente, antes de verificar o primeiro CD, você assume que ainda não tem o bendito CD. Então, você começa a comparar cada um dos CDs da sua coleção com o CD que acabou de ganhar:

Aí então vem um outro colega e te dá o CD “Em Ritmo de Aventura” do Roberto Carlos :lol: . Você então vai fazer toda aquela pesquisa novamente: Assume que ainda não tem o simpático CD do “Rei” e começa a varrer sua coleção de CDs

Sacou a jogada? Sacou o algoritmo? Tente implementar agora. Qualquer coisa, pergunte novamente, ok?

S

Olá, pessoal!

Voltei para agradecer. Obrigada pelas dicas, o problema estava em tudo que vcs falaram, rsrsrs, e tb na forma como eu tentava estruturar o code, rrs. Nada que um while… do…while…for e um if bem encadeados não resolvessem.
Obrigada Mantu.Abçs.

Criado 4 de dezembro de 2006
Ultima resposta 7 de dez. de 2006
Respostas 8
Participantes 4