Olá, Cauan. Como vai?
Parabéns pela resolução do desafio! O seu código ficou excelente, muito bem estruturado e demonstra que você compreendeu perfeitamente o funcionamento do laço while, do controle de quebra com break e o uso do for-each para percorrer coleções em Java.
Destaco também duas ótimas práticas de programação defensiva que você aplicou logo no início da captura do texto:
- O método
.trim(), que remove espaços em branco desnecessários que o usuário possa digitar sem querer no começo ou no fim do nome. - O método
.toLowerCase(), que padroniza a entrada em letras minúsculas. Isso evita falhas na validação caso o usuário digite "SAIR" ou "Ver" com letras maiúsculas.
Uma oportunidade de melhoria: Guardando o nome original
Ao aplicar o .toLowerCase() diretamente na variável opcao, você garantiu que as validações funcionassem perfeitamente. Porém, se o usuário cadastrar um convidado chamado "Ana Maria", o nome será salvo na sua ArrayList inteiramente em letras minúsculas: "ana maria". Na hora de exibir a lista (System.out.println("- " + convidado);), os nomes perderão a formatação com as letras maiúsculas originais.
Para agregar ainda mais valor ao seu projeto, uma boa prática é separar a variável de controle da variável de armazenamento. Veja como poderíamos ajustar esse trecho dentro do seu laço:
System.out.println("Digite o nome do convidado (ou 'ver' para visualizar a lista, 'sair' para encerrar): ");
String nomeDigitado = input.nextLine().trim(); // Mantém as maiúsculas originais
String comandoValidacao = nomeDigitado.toLowerCase(); // Usada apenas para os ifs
if (comandoValidacao.equals("sair")) {
System.out.println("Programa encerrado!");
break;
} else if (comandoValidacao.equals("ver")) {
System.out.println("Lista de convidados:");
if (convidados.isEmpty()) {
System.out.println("Nenhum convidado cadastrado!");
} else {
for (String convidado : convidados) {
System.out.println("- " + convidado); // Exibirá com as maiúsculas originais!
}
}
} else {
// Para evitar nomes duplicados ignorando maiúsculas/minúsculas, podemos usar uma lógica de validação
boolean jaExiste = false;
for (String c : convidados) {
if (c.equalsIgnoreCase(nomeDigitado)) {
jaExiste = true;
break;
}
}
if (jaExiste) {
System.out.println("Este convidado já está na lista");
} else {
convidados.add(nomeDigitado); // Adiciona o nome formatado corretamente
System.out.println("Convidado adicionado à lista!");
}
}
Dica de Ouro: Conhecendo o HashSet
Como o objetivo do seu código é gerenciar uma lista de convidados onde não podem existir nomes repetidos, o Java possui uma estrutura de dados nativa perfeita para esse cenário chamada HashSet.
Diferente do ArrayList, o HashSet não permite elementos duplicados por padrão. Se você tentar adicionar um elemento que já existe, ele simplesmente ignora e retorna false. Conhecer essas coleções vai te ajudar muito nos próximos passos com a linguagem!
A sua lógica está excelente e o código muito limpo. Continue praticando e compartilhando suas soluções aqui no fórum!
Espero que possa ter lhe ajudado!