Problema ao mostrar produtos cadastrados na lista

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”.

CLASSE CADASTRO

   import java.util.ArrayList;
   import java.util.List;
   import java.util.Scanner;

   public class Cadastro {
    String nome;
     int idade;
     String cpf;

public Cadastro(String nome, double preco, String cpf) {

    this.nome = nome;
    this.preco = preco;
    this.cpf = cpf;
}

public Cadastro() {

}

}

CLASSE MAIN

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;

    public class Main {
    Cadastro cadastro = new Cadastro();
    List<Cadastro> dados = new ArrayList();
    Scanner entrada = new Scanner(System.in);

public void cadastrar() {

    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(new Cadastro(cadastro.nome, cadastro.preco, cadastro.cpf));

   }

public  void consultarCompra() {
    System.out.println("INFORME SEU CPF: ");
    String cpf = entrada.next();

    for (int i = 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");

    }
}
}

   public static void main(String[] args) {
   int resp;
   Cadastro cadastro = new Cadastro();
   Scanner entrada = new Scanner(System.in);
   Main co = new Main();
   int opcao;
   do {
       System.out.println(" 1- CADASTRAR");
       System.out.println(" 2- BUSCAR POR CPF");
        opcao = entrada.nextInt();

    switch (opcao) {
    case 1:
        co.cadastrar();
        break;
    case 2:
        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?

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.

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.

Antes de criar um novo cadastro você está alterando o cadastro existente.
Cria um novo cadastro e seta os atributos do novo cadastro.

public void cadastrar() {
    Cadastro novo = new Cadastro();
    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);
}
1 curtida

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.

dados.add(new Cadastro(cadastro.nome, cadastro.preco, cadastro.cpf));
1 curtida

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 existente
System.out.println("PREÇO: ");
cadastro.preco = entrada.nextDouble();  // está alterando o preço do cadastro existente
System.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 existente
dados.add(new Cadastro(cadastro.nome, cadastro.preco, cadastro.cpf));
1 curtida

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.

Olá, pessoal! Realmente eu não especifiquei bem o problema e deu a entender que o problema era outro. O problema não está no método “cadastrar”, e sim no método “consultarCompra”. Pois ele está guardando na lista corretamente. O problema está no método “consultarCompra”, por exemplo:
CPF = 123;
Compra A = celular;
Compra A = notebook;

CPF = 321;
Compra B = tv;

Imprimindo na tela…
CPF = 123;
O dono deste CPF comprou: Celular
O dono deste CPF comprou: notebook;
O dono deste CPF comprou: notebook;

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.

   public  void consultarCompra() {
	    System.out.println("INFORME SEU CPF: ");
	    String cpf = entrada.next();
	    boolean achou = false;
	    for (int i = 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");
	    	
	      }
 	             }

Agora a saída das informações estão corretas.

Compra A = celular;
Compra A = notebook;

Compra B = tv;

1 curtida