Bem, estou com um probleminha no código a seguir. Ao comprar 2 dois produtos com CPF distintos ele simplesmente mostra a mensagem “CPF NÃO ENCONTRADO”.
importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;publicclassMain{Cadastrocadastro=newCadastro();List<Cadastro>dados=newArrayList();Scannerentrada=newScanner(System.in);publicvoidcadastrar(){System.out.println("NOME: ");cadastro.nome=entrada.next();System.out.println("PREÇO: ");cadastro.preco=entrada.nextDouble();System.out.println("CPF: ");cadastro.cpf=entrada.next();dados.add(newCadastro(cadastro.nome,cadastro.preco,cadastro.cpf));}publicvoidconsultarCompra(){System.out.println("INFORME SEU CPF: ");Stringcpf=entrada.next();for(inti=0;i<dados.size();i++){if(dados.get(i).cpf.equals(cpf)){System.out.println("O DONO DESTE CPF COMPROU: \n"+dados.get(i).nome);}else{System.out.println("CPF NÃO ENCONTRADO");}}}publicstaticvoidmain(String[]args){intresp;Cadastrocadastro=newCadastro();Scannerentrada=newScanner(System.in);Mainco=newMain();intopcao;do{System.out.println(" 1- CADASTRAR");System.out.println(" 2- BUSCAR POR CPF");opcao=entrada.nextInt();switch(opcao){case1:co.cadastrar();break;case2:co.consultarCompra();break;}System.out.println("DIGITE 0 PARA VOLTAR");resp=entrada.nextInt();}while(resp==0);}}
Não entendi bem o problema.
Pode explicar o passo a passo?
L
Leo1360
Posso estar errado, mas pelo q entendi vc está alterando o mesmo cadastro cada vez que coloca o ele na lista, salvo engano a lista aponta para o endereço do cadastro, logo na lista só teriam vários ponteiros para o mesmo objeto, para cada cadastro vc vai precisar criar uma nova instancia de Cadastro.
R
RoinujNosde
Ele está fazendo new Cadastro ao adicionar na lista, então acho que esse não é o problema.
Mas ficar alterando a todo momento aquela instância de Cadastro é desnecessário mesmo.
S
staroski1 like
Antes de criar um novo cadastro você está alterando o cadastro existente.
Cria um novo cadastro e seta os atributos do novo cadastro.
publicvoidcadastrar(){Cadastronovo=newCadastro();System.out.println("NOME: ");novo.nome=entrada.nextLine();// ao ler do teclado, utilize somente nextLine()System.out.println("PREÇO: ");novo.preco=Double.parseDouble(entrada.nextLine());// ao ler do teclado, utilize somente nextLine()System.out.println("CPF: ");novo.cpf=entrada.nextLine();// ao ler do teclado, utilize somente nextLine()dados.add(novo);}
L
Leo1360
Então, mas ele só da new quando instancia a classe ‘Main’, que no caso ele tá usando apenas uma instancia, o objeto chamado ‘co’, logo toda vez ele altera o mesmo cadastro (co.cadastro), ele precisa fazer como o staroski colocou.
Sim, acontece que antes de criar esse new Cadastro(cadastro.nome, cadastro.preco, cadastro.cpf) ele está alterando os atributos do cadastro que ele instanciou uma única vez na declaração do atributo da classe Main, veja:
System.out.println("NOME: ");cadastro.nome=entrada.next();// está alterando o nome do cadastro existenteSystem.out.println("PREÇO: ");cadastro.preco=entrada.nextDouble();// está alterando o preço do cadastro existenteSystem.out.println("CPF: ");cadastro.cpf=entrada.next();// está alterando o CPF do cadastro existente// e agora está criando um novo cadatro copiando os atributos do cadastro existentedados.add(newCadastro(cadastro.nome,cadastro.preco,cadastro.cpf));
R
RoinujNosde
Ele ter essa instância de Cadastro na Main e ficar alterando ela não faz sentido, certo.
Mas ainda não vejo como isso é o problema.
Ele está criando uma nova instância ao adicionar na lista.
Não está adicionando a instância da Main.
CPF = 321;
CPF não encontrado
CPF não encontrado
O dono deste CPF comprou: tv
Observem que na compra A ele duplica o notebook e na compra B ele mostra 2 mensagens de CPF não encontrado e em seguida a tv. Pensei aqui e já consegui resolver o problema como uma variável booleana.
publicvoidconsultarCompra(){System.out.println("INFORME SEU CPF: ");Stringcpf=entrada.next();booleanachou=false;for(inti=0;i<dados.size();i++){if(dados.get(i).cpf.equals(cpf)){System.out.println("O DONO DESTE CPF COMPROU: \n"+dados.get(i).nome);achou=true;}}if(!achou){System.out.println("CPF NÃO CADASTRADO");}}