Capture o nome de três pessoas, não permitindo a inserção de nomes repetidos

8 respostas
ClaudiovieiraII

Olá, pessoal! Estou com uma dúvida. Tenho que fazer um trabalho para amanhã e como não consegui conclui-lo até hoje, decidir pedir ajuda e aprender com os mais experientes.

Bem, tenho que capturar o nome de três pessoas, não permitindo a inserção de nomes repetidos… Okay, minha primeira ideia foi fazer simples IF comparando a String, se ela fosse igual ela mesma, não poderia continuar a operação… Por algum poder maior não deu certo. Com ajuda de uns amigos, chegamos a algo assim:

package exec_13;

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

public class Exec_13 {

public static void main(String[] args) {

ArrayList pessoas = new ArrayList ();

int contador = 0 ;

Pessoa p = new Pessoa();
    String nome = "";
    
    do{
        boolean ok = true;
   
        nome = (JOptionPane.showInputDialog(null, "nome"));
         
    
    
    
     for(int i = 0; i <  pessoas.size();i++ ){
      if(nome.contentEquals(pessoas.get(i).getnome()) && nome.equalsIgnoreCase(pessoas.get(i).getnome())){
        
            ok = false;
            return;
      }
     }
     
        if(ok = true){
    
        p.setnome(nome);
          
               

    contador++;
    
    pessoas.add(p);
    
    }
    while(ok = true)
        }
    }

Eu sei que ele vai executar inicialmente o Do, e enquanto ele não chegar na condição que satisfaça o While, o problema é que estou totalmente perdido nesse código, como devo prosseguir com esse while? Por favor, expliquem para que eu possa entender o erro.

8 Respostas

alxdre.pestana

ClaudiovieiraII:
Olá, pessoal! Estou com uma dúvida. Tenho que fazer um trabalho para amanhã e como não consegui conclui-lo até hoje, decidir pedir ajuda e aprender com os mais experientes.

Bem, tenho que capturar o nome de três pessoas, não permitindo a inserção de nomes repetidos… Okay, minha primeira ideia foi fazer simples IF comparando a String, se ela fosse igual ela mesma, não poderia continuar a operação… Por algum poder maior não deu certo. Com ajuda de uns amigos, chegamos a algo assim:

package exec_13;

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

public class Exec_13 {

public static void main(String[] args) {

ArrayList pessoas = new ArrayList ();

int contador = 0 ;

Pessoa p = new Pessoa();
    String nome = "";
    
    do{
        boolean ok = true;
   
        nome = (JOptionPane.showInputDialog(null, "nome"));
         
    
    
    
     for(int i = 0; i <  pessoas.size();i++ ){
      if(nome.contentEquals(pessoas.get(i).getnome()) && nome.equalsIgnoreCase(pessoas.get(i).getnome())){
        
            ok = false;
            return;
      }
     }
     
        if(ok = true){
    
        p.setnome(nome);
          
               

    contador++;
    
    pessoas.add(p);
    
    }
    while(ok = true)
        }
    }

Eu sei que ele vai executar inicialmente o Do, e enquanto ele não chegar na condição que satisfaça o While, o problema é que estou totalmente perdido nesse código, como devo prosseguir com esse while? Por favor, expliquem para que eu possa entender o erro.

Olá boa noite!

Eu usaria uma solução paleativa com TreeSet - Ele possui um ótimo controle e não adiciona valores repetidos e ainda ordena os mesmos
Como é apenas 3 registros.

Observe:

//Declarando TreeSet
TreeSet<String> ts = new TreeSet<String>();

//Voce ira receber o nome da pessoa pelo objeto 
//E consequentemente tenta-lo adicionar no TreeSet considerando apenas 3 registros

//Qtd de registros
int sSize = ts.size();

//Verificando se possui menos de 3
if(sSize < 3){

   
    if(nomeRecebido != null){
        
       //Efetuando um TRIM NO NOME CASO NAO TENHA EFETUADO
       nomeRecebido = nomeRecebido.trim();

       if(!nomeRecebido.equals("")){   
           
              //Adicionando registro no TreeSet
             ts.add(nomeRecebido.trim());

            //Verificando se adicionou o nome
            if(ts.size() > sSize)
                 System.out.println("Nome adicionado com sucesso!");
            else
                System.out.println("Nome já existe e não foi adicionado");


       }else{
           
            System.out.println("Nome inválido");
       }

    }else{
        System.out.println("nome invalido");
    }



}else{
   System.out.println("Não é possivel adicionar, ja possui 3 nomes...")
}




//Agora para voce pegar os nomes, voce pode fazer um Iterator no TreeSet para pegar os dados e jogar em um Array de String
//Declarando novo Array
String sSaida[] = new String[ts.size()];
        
//Percorrendo TreeSet para retornar filtro
Iterator i = ts.iterator();
int x = 0;
while(i.hasNext()){
    sSaida[x] = i.next().toString();
    x++;
}

Da uma olhada e ve se isso te ajuda…

Um forte abraço

tondatto

Que tal você fazer um loop que só adiciona na List pessoas um valor que não exista e assim que o seu tamanho chegar a 3, pára.

List<String> pessoas = new ArrayList(); while(pessoas.size() < 3){ String nome = JOptionPane.showInputDialog(null, "nome"); if(pessoas.indexOf(nome) == -1){ pessoas.add(nome); } }

ClaudiovieiraII

Tondatto, agradeço o apoio, a minha primeira ideia foi fazer algo (provavelmente) semelhante, porém, como estou chegando agora na programação, funções são um bicho de sete cabeças para mim.

Você poderia me explicar o que está ocorrendo no if, na condição ele faz uma comparação com o que?

Agradeço o apoio, abraço!

ClaudiovieiraII

alxdre.pestana, estou debbugando a resposta que você enviou e achei ela super completa também :slight_smile: mas ainda me perco muito nas funções para os objetos. Será que existe algum site (em português) que explique o que cada função faz? Desde já agradeço a atenção e o apoio, me ajudaram muito!

tondatto
ClaudiovieiraII:
Você poderia me explicar o que está ocorrendo no if, na condição ele faz uma comparação com o que?
Claro. Segue o código que postei comentado.
// Implementa uma List de String
List<String> pessoas = new ArrayList(); 

// enquanto a quantidade de itens na List for menor que 3
while(pessoas.size() < 3){  

	// Lê nome informado pelo usuário
    String nome = JOptionPane.showInputDialog(null, "nome");  
	
	// o método indexOf retorna a posição do parâmetro (no caso, 'nome')
	// na List. 
	// Quando o parâmetro não é encontrado, ele retorna -1
	// "Se o nome ainda não existe na List, adicioná-lo"
    if(pessoas.indexOf(nome) == -1){  
        pessoas.add(nome);  
    }  
}
ClaudiovieiraII

Entendi! A List String me criou uma lista limitada pelo while, correto? Fiquei com dúvida no trecho do “-1”, no caso eu tenho que ter 3 strings, caso a string seja igual “-1” vai adicionar o valor de nome para a Lista, certo? Especificamente nesse -1 estou me perdendo x) Desculpa o incomodo, se puder explicar novamente esse trecho…

Abs!

tondatto

Pense no List como um vetor/array.

A função/método indexOf procura no “array” onde está o valor que você está passando no parâmetro e retorna a posição deste.

Suponha que na sua “List pessoas”, já entraram com dois nomes:
[0] = “Joao”
[1] = “Jose”

Temos que: size/tamanho = 2

Se o usuário entrar com “Joao”, o if vai testar:
if(pessoas.indexOf(“Joao”) == -1)
em outras palavras : na Lista, em que posição está o valor “Joao”? se o valor não for encontrado, ele retorna a posição -1.
Ele vai retornar 0, pois há um “Joao” na posição ‘0’, certo?
Então ele vai comparar: 0 é igual a -1 ?, lógicamente não. Então ele não adiciona na lista o nome, pois é repetido e mais uma vez solicita ao usuário entrar com o nome.

G

Tudo pode usar Set e sobrescrever o equals e o hashCode ou pode usar List e sobrescrever o equals e usar o contains.

Criado 10 de setembro de 2012
Ultima resposta 11 de set. de 2012
Respostas 8
Participantes 4