Valores repetidos no vetor

Como faço para comparar no vetor os numeros repetido e dizer quais os numeros repetidos e a quantidade que foram repetidos. Fiz de uma maneira, mas toda vez que digito um número, ele diz que aquele numero foi repetido tantas vezes. Eu quero que no final ele só diga os números repetidos e quantas vezes foram repetidos.

public static void main(String[] args) {
	Scanner s = new Scanner(System.in);
	
	int quant;
	int cont =0;
	int atual;
	
	System.out.println("Digite o tamanho do vetor");
	quant = s.nextInt();
	
	int vetValor[] = new int [quant];
	int valor;
	int vetDif[] = new int [quant];
	int vetIgual[] = new int [quant];
	
	for(int i=0; i<vetValor.length;i++){
		System.out.println("Digite os valores");
		valor = s.nextInt();
		vetValor[i] = valor;
	}
	
	
	for(int i=0; i< vetValor.length;i++){
		atual = vetValor[i];
		cont =0;
		for(int j=0; j<vetValor.length;j++){
			
			if(vetValor[j] ==atual){
				cont++;
				vetIgual[i] = atual;
			}else{
				vetDif[j] = atual;
				
			}
			
		}

Vamos la

Existe uma forma pratica e uma forma com poucos recursos de fazer isso

a forma pratica é criar um Map<Integer,Integer> onde a chave é o numero e o valor sera a quantidade de repetições. se vc sabe usar essas estruturas de dados é um prato cheio.

a forma com poucos recursos tem duas formas de faze-lo:

a primeira é estabelecer um intervalo pequeno de numeros ( exemplo de 0 a 9 ) e ai vc usa o numero como indice e o valor como quantidade.

for(int =0; i< array_com_numeros_repetidos.length ; i++ ) {  
   numero = array_com_numeros_repetidos[i];
   array_com_numeros_e_quantidade_repeticao[ numero ] ++;
}

agora se vc pode ser numero inteiro vc nao tera memoria suficiente. ate Short positivo vai, que é Short.MAX_VALUE ( short é um inteiro menor ).

a segunda abordagem é vc criar uma estrutura desse tipo

public class No {
   private No proximo;
   private int valor;
   private int quantidade;
   public No (int valor) { 
       this.valor = valor; 
       this.quantidade =1; 
       this.proximo = null;
    }

   public void incrementaQuantidade { this.quantidade++; }
   public int getQuantidade() { return this.quantidade; }
   /* getValor e getProximo */
   public No procura( int valor ) {
       if ( this.valor == valor ) {
           return this;
       }
       if ( proximo != null ){
           return proximo.procura( valor ); // recursao
       } 

       return null;
   }
   public void adicionaAoFim( int valor ) {
        if ( proximo == null ) {
            proximo = new No( valor );
        } else {
            proximo.adicionaAoFim( valor ); // recursao
        }
   }
}

como vc pode ver isso é uma lista encadeada. vc cria o primeiro elemento TOPO com o valor do elemento 0 do array e itera sobre os proximos elementos do array.

vc encontrou? entao vc incrementaQuantidade. nao encontrou? adiciona no fim. Se vc pode usar um List entao vc pode usar um Map e tudo isso é desnecessario.

no final vc tem uma lista com elementos unicos e as quantidades.

uma ultima forma:

se vc puder ORDENAR o array, fica trivial pois se vc tem algo como

int [] array = { 1, 2, 2, 2, 3, 3 };

vc so precisa fazer um loop e saber se o elemento atual é diferente do anterior.

int anterior = array[0];
int quantidade = 1;
for(int i= 1;i< array.length; i++ ){
    int atual = array[i];
    if ( atual == anterior ) { 
      quantidade++;
    } else {
      System.out.println("o valor " + anterior + " aparece " + quantidade + " vezes ");
      quantidade = 1; /* pra ser usado na proxima vez*/
    }
    anterior = atual; /* guarda atual*/
}

desse jeito vc só imprime. e ordenar um array pode não ser pratico no seu nivel de aprendizado, vai saber.

divirta-se

1 curtida