Jump to content
Firewall

[Resolvido] Verificar valores repetidos

Recommended Posts

Firewall

Olá á todos

Bem me deparo com um problema, eu estou fazendo um programa que o usuário digite o tamanho do vetor, e após definir o tamanho preencher todo o vetor com números. Até aqui tudo bem(muito fácil...até de mais).

Mas agora tem um pequeno problema eu consegui fazer para verificar se existe números iguais e mostrar, mas quando eu rodo o programa ele funciona perfeitamente até quando tiver 2 números iguais, se passar de 2 números iguais em no vetor ele já fica doido. olhe minha lógica:

for(int i=0;i<TAMVET-1;i++){
 for(int j = i+1; j <TAMVET;j++){
if (numero[j] == numero[i]) {
  System.out.println("O elemento" +numero[j] + "se repete \n");
}
 }
}

já fiz vários tipos de estrutura para pegar o valor que se repete no vetor, mas o que até agora oque deu mais certo foi este.



import javax.swing.JOptionPane;
public class vetor10PosiçõesInformarIguais {
 public static void main(String[] args){
int TAMVET = Integer.parseInt(JOptionPane.showInputDialog("Porfavor, Informe o Tamanho do Vetor")); //Foi colocado para o usuario digitar o tamanho do VETOR( isto para vcs fazerem testes, pra ficar mais agilizado
int numero[] = new int[TAMVET]; // o tamanho informado será armazenado na array "numero"
String m = ""; //isto servira como um System.out.println, já que estamos utilizando interface gráfica
boolean verificador = false; //um simples operador de decisão para o Bubble sort e para mostrar se há ou nao valores repetidos no vetor
boolean repetiu = false; // ele será para verficar se repetiu ou nao o numero no vetor...mas devem estar se perguntando porque nao utilizei o boolean acima(verificador),Simples a variavel só poderá realizar a sua designação, se utilizar a mesma variavel para fazer varios tipos de decisões que nao tem nada a ver com o motivo na qual ela foi criada, o programa não estará seguindo a convenção de código

//Este Ciclo for será para armazenar valores no vetor "numero"
for(int i = 0; i < TAMVET; i++){
  int x = Integer.parseInt(JOptionPane.showInputDialog("Digite o Numero da " +(i)+ "º Posição do Vetor"));// utilizamos a variavel de escopo temporaria x para receber o valor informado pelo usuario
  numero[i] = x;
}

/*
 * Este while(abaixo) fará oque nós programadores conhecemos como Bubble sort, ele téra como funcionalidade, organizar o vetor do menor numero ao maior por exemplo
 * Se no vetor foi armazenado assim(supondo que seja 3 numeros): [5,8,0,2]
 * o Bubble sort irá organizar desta forma [0,2,5,8].
 * Mas porque foi utilizado o Bubble sort?
 * R: Relativamente Simples(relativamente *-*),existem varias formas de se resolver o problema proposto por este exercicio,mas a forma que utilizei irá fazer
 * com que ele olhe na posição seguinte e veja se ela é ou nao parecida e se nao for pula pra proxima linha do vetor e assim se nao utilizar o Bubble sort irá
 * sempre dar um monte de numeros nada a ver com oque foi digitado.
 */
while(!verificador){ //se verificador for diferente de true entao ele entrano ciclo, lembrando oque foi feito nesta linha é um resumo de while(verificador != true){
  verificador = true; //o verficador é atribuido verdadeiro
  for(int i=0; i<TAMVET-1; i++){ //até aqui tudo bem só uma estrutura para percorrer o vetor
	if(numero[i] > numero[i+1]){ //se o numero, for maior que o, numero uma posição a frente, então ele entra no ciclo
	  verificador = false; // e o verificador é atribuido o valor de falso
	  int x = numero[i+1];// a variavel de escopo temporaria o "x" para armazenar o valor de numero na posição +1(a frente) do ciclo for(o i)
	  numero[i +1]= numero[i]; // o valor de numero na posição +1(a frente) do ciclo for(o i) irá receber o numero na posição do ciclo sem nehuma modificação
	  numero[i] = x; // e assim o numero do ciclo sem modificação irá receber o valor de x
	} //fechamos o if
  } // fechamos o for
} //por fim, fechamos o while

/*
 * Ahá, Agora vem a parte sistematica do programa aonde nós realmente iremos resolver o problema do exercicio proposto:
 * no final irei explicar oque foi feito para descobrir qual os valores que foram repetidos, não explicarei agora porque explicar sem ver é complicado
 */
m+=("-----------~~'OS Valores Repetidos'~~-------------- \n"); // a varivel m fará um papel parecido do System.out.println aonde mostrar em uma janela a mensagem que foi informada
for(int i=0;i<TAMVET-1;i++){
  for(int j = i+1; j <TAMVET;j++){
	if (numero[j] == numero[i]) {
	  repetiu = true;
	  m+=("O elemento" +numero[j] + "se repete \n");
	}
  }
}
if(!repetiu){m+=(" ~~'Nenhum Elemento Foi Repetido'~~");}
JOptionPane.showMessageDialog(null,m);
 }
}

Edited by Firewall
Corrigida indentação.

Share this post


Link to post
Share on other sites
HappyHippyHippo

xiii ....

int numero[] = new numero[10];                                 // isto é exemplo porque dizes que está feito

Arrays.sort(numero);                                           // ordenar o array

for (int i = 1; i < numero.length(); i++) {                    // ciclo de comparação
 if (numero[i] == numero[i-1])                                // comparação com o anterior, lembra-te que o array já se encontra ordenado
   System.out.println("O elemento" +numero[j] + "se repete"); // não é necessário o '\n', a função println já faz isso
}

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Firewall

xiii ....

int numero[] = new numero[10];								 // isto é exemplo porque dizes que está feito

Arrays.sort(numero);										   // ordenar o array

for (int i = 1; i < numero.length(); i++) {					// ciclo de comparação
 if (numero[i] == numero[i-1])								// comparação com o anterior, lembra-te que o array já se encontra ordenado
System.out.println("O elemento" +numero[j] + "se repete"); // não é necessário o '\n', a função println já faz isso
}

Primeiramente obrigado por responder...

fiz uma correção para dar certo....

for (int i = 1; i < numero.length; i++) { // no length nao precisa ter o (), somente se for em um método(pelo que eu me lembre é, me corriga se eu estiver errado)
}

HappyHippyHippo, ficou na mesma coisa, olhe bem se eu fazer assim se eu colocar mais de 2 numeros iguais ele buga todo, olha o exemplo...

agora irei preencher o vetor de tamanho 4, vamos supor que o usuario digitou e foi ordenado, e ficou assim

[1,1,6,7]

o programa irá me mostrar assim:

O elemento 1 se repete

O elemento 2 se repete

Ok, deu tudo certo.... mas olhe oque acontece em um segundo exemplo...

agora irei preencher o vetor de tamanho 4, vamos supor que o usuario digitou e foi ordenado, e ficou assim

[1,1,1,7]

o programa irá me mostrar assim:

O elemento 1 se repete

O elemento 1 se repete

Viu.. não sei porque o programa faz isto... ou minha lógica está errada, ou não sei...

@OBS: pode me dizer como você fez pra o código ficar colorido... fica mais fácil a compreensão =)

Edited by Firewall

Share this post


Link to post
Share on other sites
HappyHippyHippo

Ok, deu tudo certo.... mas olhe oque acontece em um segundo exemplo...

agora irei preencher o vetor de tamanho 4, vamos supor que o usuario digitou e foi ordenado, e ficou assim

[1,1,1,7]

o programa irá me mostrar assim:

O elemento 1 se repete

O elemento 1 se repete

Viu.. não sei porque o programa faz isto... ou minha lógica está errada, ou não sei...

int last = numero[0] + 1;                 // variável usada para prevenir a repetição do valor
for (int i = 1; i < numero.length; i++) {
 if (numero[i] == numero[i-1] &&
     last != numero[i-1]) {              // o valor a ser verificado tem de ser diferente do último apresentado
   last = numero[i];                     // actualizar a variável de verificação
   System.out.println("O elemento" + last + "se repete");
 }
}

@OBS: pode me dizer como você fez pra o código ficar colorido... fica mais fácil a compreensão =)

quando escreves código no forum, usaste as tags [ code] e [ /code] (sem espaços claro)

para activar o syntaxe highlight, tens de definir qual a linguagem que estás a apresentar:

[ code=java] ... [ /code] (sem espaços claro)

  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Firewall

int last = numero[0] + 1;				 // variável usada para prevenir a repetição do valor
for (int i = 1; i < numero.length; i++) {
 if (numero[i] == numero[i-1] &&
  last != numero[i-1]) {			  // o valor a ser verificado tem de ser diferente do último apresentado
last = numero[i];					 // actualizar a variável de verificação
System.out.println("O elemento" + last + "se repete");
 }
}

quando escreves código no forum, usaste as tags [ code] e [ /code] (sem espaços claro)

para activar o syntaxe highlight, tens de definir qual a linguagem que estás a apresentar:

[ code=java] ... [ /code] (sem espaços claro)

Muito obrigado não me atentei em fazer uma variavel para fazer a intermediação, e ainda por cima estava fazendo o inverso... obrigado =)

e para fins didáticos caso alguém queira , aqui esta o código com funcionando,


import java.util.Arrays;
import javax.swing.JOptionPane;  
public class PaneEX2 {
 public static void main(String[] args){
   int TAMVET = Integer.parseInt(JOptionPane.showInputDialog("Porfavor, Informe o Tamanho do Vetor"));  //Foi colocado para o usuario digitar o tamanho do   VETOR( isto para vcs fazerem testes, pra ficar mais agilizado
   int numero[] = new int[TAMVET]; // o tamanho informado será armazenado na array "numero"
   String m = ""; //isto servira como um System.out.println, já que estamos utilizando interface gráfica
   boolean repetiu = false; // ele será para verificar se repetiu ou não o numero no vetor...

   //Este Ciclo for será para armazenar valores no vetor "numero"
   for(int i = 0; i < TAMVET; i++){ 
     numero[i] = Integer.parseInt(JOptionPane.showInputDialog("Digite o Numero da " +(i)+ "º Posição do Vetor"));// utilizamos a variavel de escopo temporaria x para receber o valor informado pelo usuario
   }

   Arrays.sort(numero); // ordenar o vetor

   m+=("-----------~~'OS Valores Repetidos'~~--------------  \n"); // a varivel m fará um papel parecido do System.out.println aonde mostrar em uma janela a mensagem que foi informada e o += serve para somar o conteudo na mesma janela ou seja, tudo que for informado para o m+= será acrecentado na mesma janela anterior.
   int last = numero[0] + 1;                 // variável usada para prevenir a repetição do valor
   for (int i = 1; i < numero.length; i++) {
     if (numero[i] == numero[i-1] && last != numero[i-1]) {              // o valor a ser verificado tem de ser diferente do último apresentado
       repetiu = true;
       last = numero[i];                     // actualizar a variável de verificação
       System.out.println("O Numero: " + last + " Se Repete no Vetor");
     }
   }
   if(!repetiu){m+=("                 ~~'Nenhum Elemento Foi Repetido'~~");}
   JOptionPane.showMessageDialog(null,m); // mostra na janela a variavel m.
 }
}

Agradecimento á HappyHippyHippo, pela grande ajuda.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.