Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Dúvida] Fiz mas a lista não retorna corretamente

Bom dia. Estou tomando um erro aqui. Pode me ajudar? Criei meu exercício com o usuário digitando os dados da pessoa. Só que na hora de consultar, o retorno veio sempre com os dados da última pessoa, não importa quantas eu faça, ele sempre preenche todas as posições com o último nome. Alguém pode me ajudar?

public class ExerciciosPessoa {
    public static void main(String[] args) {
        Pessoa pessoa = new Pessoa();
        ArrayList<Pessoa> listaDePessoas = new ArrayList<>();
        Scanner leitura = new Scanner(System.in);
        int opcaoMenu = 0;
        String menu = """
                -----------------------------
                1- Cadastrar Pessoa
                2- Consultar Primeira Pessoa
                3- Consultar Lista Completa
                4- Sair
                -----------------------------
                """;

        System.out.println(">>> Testes de Array - Classe Pessoa <<<");
        while (opcaoMenu != 4) {
            System.out.println(menu);
            opcaoMenu = leitura.nextInt();
            switch (opcaoMenu) {
                case 1:
                    System.out.println("Digite o nome");
                    pessoa.setNome(leitura.next());
                    System.out.println("Digite a idade");
                    pessoa.setIdade(leitura.nextInt());
                    listaDePessoas.add(pessoa);
                    System.out.println(pessoa);
                    break;
                case 2:
                    System.out.println("Imprimir primeira pessoa cadastrada");
                    System.out.println("Primeira pessoa cadastrada: " + listaDePessoas.get(0).toString());
                    break;
                case 3:
                    System.out.println("Imprimir lista completa");
                    System.out.println(listaDePessoas);
                    System.out.println("Quantidade de registros: " + listaDePessoas.size());
                    break;
            }
        }
    }
}
    @Override
    public String toString() {
        return "Dados de Pessoa: Nome: " + nome +" Idade: " + idade;
    }

Inserindo as pessoas

Buscar a lista

3 respostas
solução!

Oiii Marcus, analisei seu código, queria testar antes de te dar a resposta mas não consegui simular tudo. Então, se der certo, peço a gentileza de me avisar porque eu ADORO um problema em Java KKKK

Acredito que o problema que você está enfrentando ocorre porque você está reutilizando o mesmo objeto pessoa em todas as iterações do loop enquanto cadastrar novas pessoas. Como ArrayList armazena referências aos objetos, e não cópias dos objetos, todas as entradas na lista se referem ao mesmo objeto pessoa.

Para corrigir isso, você precisa criar uma nova instância de Pessoa dentro do loop cada vez que desejar adicionar uma nova pessoa à lista.

public class ExerciciosPessoa {
    public static void main(String[] args) {
        ArrayList<Pessoa> listaDePessoas = new ArrayList<>();
        Scanner leitura = new Scanner(System.in);
        int opcaoMenu = 0;
        String menu = """
                -----------------------------
                1- Cadastrar Pessoa
                2- Consultar Primeira Pessoa
                3- Consultar Lista Completa
                4- Sair
                -----------------------------
                """;

        System.out.println(">>> Testes de Array - Classe Pessoa <<<");
        while (opcaoMenu != 4) {
            System.out.println(menu);
            opcaoMenu = leitura.nextInt();
            switch (opcaoMenu) {
                case 1:
                    Pessoa pessoa = new Pessoa(); // Criando uma nova instância de Pessoa
                    System.out.println("Digite o nome");
                    pessoa.setNome(leitura.next());
                    System.out.println("Digite a idade");
                    pessoa.setIdade(leitura.nextInt());
                    listaDePessoas.add(pessoa);
                    System.out.println(pessoa);
                    break;
                case 2:
                    System.out.println("Imprimir primeira pessoa cadastrada");
                    if (!listaDePessoas.isEmpty()) {
                        System.out.println("Primeira pessoa cadastrada: " + listaDePessoas.get(0).toString());
                    } else {
                        System.out.println("Nenhuma pessoa cadastrada ainda.");
                    }
                    break;
                case 3:
                    System.out.println("Imprimir lista completa");
                    System.out.println(listaDePessoas);
                    System.out.println("Quantidade de registros: " + listaDePessoas.size());
                    break;
            }
        }
    }
}

Espero que dê certo o/

Olá, Eryck. Estou bem e você? Espero que sim.

Cara, você acertou em cheio. Funcionou perfeitamente. Obrigado por essa dica. Eu gosto de deixar as minhas entradas de massa sempre dinâmicas, meio que prontas para outras possibilidades e você salvou a lavoura hoje. Ainda coloquei mais uma condiçãozinha pra ficar mais maneiro. Segue o resultado final:

package screenmatch.src;

import alura.exercises.modelos.Pessoa;

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

public class ExerciciosPessoa {
    public static void main(String[] args) {
        ArrayList<Pessoa> listaDePessoas = new ArrayList<>();
        Scanner leitura = new Scanner(System.in);
        int opcaoMenu = 0;
        String continua = "s";
        String menu = """
                -----------------------------
                1- Cadastrar Pessoa
                2- Consultar Primeira Pessoa
                3- Consultar Lista Completa
                4- Sair
                -----------------------------
                """;

        System.out.println(">>> Testes de Array - Classe Pessoa <<<");
        while (opcaoMenu != 4) {
            System.out.println(menu);
            opcaoMenu = leitura.nextInt();
            switch (opcaoMenu) {
                case 1:
                    while (continua.equalsIgnoreCase("s")){
                        Pessoa pessoa = new Pessoa(); // Criando uma nova instância de Pessoa
                        System.out.println("Digite o nome");
                        pessoa.setNome(leitura.next());
                        System.out.println("Digite a idade");
                        pessoa.setIdade(leitura.nextInt());
                        listaDePessoas.add(pessoa);
                        System.out.println(pessoa);
                        System.out.println("Deseja continuar incluindo pessoas? (S/N)");
                        continua = leitura.next();
                    }
                    break;
                case 2:
                    System.out.println("Imprimir primeira pessoa cadastrada");
                    System.out.println("Primeira pessoa cadastrada: " + listaDePessoas.get(0));
                    break;
                case 3:
                    System.out.println("Imprimir lista completa");
                    System.out.println(listaDePessoas);
                    System.out.println("Quantidade de registros: " + listaDePessoas.size());
                    break;
            }
        }
    }
}

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Saaaaaaaaaalve meu bom, que bom que deu certo.

Que sacada excelente dessa condição que você implementou! Muito boa mesmo. :O

Essa troca foi muito boa, valeu a gentileza de avisar que deu certo. E tamo aí meu querido, boraaa