Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Sugestão] Usando propriedades da String para validação de nome

Este é um código de exemplo para uma simples validação de nome com sistema de formatação. Ele remove os espaços laterais da String, a transforma em um array utilizando o método split(" "), e depois itera sobre esse array, juntando novamente cada elemento com a primeira letra em maiúscula (usando charAt(0)) e o restante em minúsculas com substring. Cada palavra é separada por um espaço " ", e no final, a String formatada é retornada.

Código que fiz:

package com.github.rickmvi.challenge07;

import com.github.rickmvi.jtoolbox.console.Out;
import com.github.rickmvi.jtoolbox.console.utils.ScannerUtils;
import com.github.rickmvi.jtoolbox.control.While;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;

import java.util.concurrent.atomic.AtomicReference;

public class ValidName {
    public static void main(String[] args) {
        ScannerUtils.init();

        Out.print("Enter your name: ");
        AtomicReference<String> name = new AtomicReference<>(ScannerUtils.nextLine());

        if (name.get().isEmpty()) return;

        While.whileTrue(
                () -> name.get().length() < 3,
                () -> {
            Out.print("Your name is too short, please try again: ");
            name.set(ScannerUtils.nextLine());
        });

        ScannerUtils.close();
        Out.printFormatted("Your name is: {}", formatString(name.get()));
    }

    @Contract(pure = true)
    private static @NotNull String formatString(String str) {
        if (str == null || str.isEmpty()) return "";

        String args1 = str.trim();
        String[] args2 = args1.split(" ");
        StringBuilder args3 = new StringBuilder();
        
        for (String s : args2) {
            if (s.isEmpty()) continue;

            args3.append(Character.toUpperCase(s.charAt(0)))
                 .append(s.substring(1).toLowerCase().trim())
                 .append(" ");
        }

        return args3.toString().trim();
    }
}

Imagem do código:
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Sainda no console:
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta
solução!

Olá, Rick! Tudo certo?

Seu código está bem estruturado, mas parece que a validação do nome não está funcionando exatamente como o esperado. Vamos ajustá-lo para garantir que o nome tenha pelo menos 3 caracteres antes de prosseguir.

Aqui está uma sugestão de como você pode fazer isso:

import java.util.Scanner;

public class ValidName {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String name;

        do {
            System.out.print("Digite seu nome: ");
            name = scanner.nextLine().trim();

            if (name.length() < 3) {
                System.out.println("Nome inválido. Digite novamente.");
            }
        } while (name.length() < 3);

        System.out.println("Nome \"" + formatString(name) + "\" cadastrado com sucesso!");
        scanner.close();
    }

    private static String formatString(String str) {
        if (str == null || str.isEmpty()) return "";

        String[] words = str.split(" ");
        StringBuilder formattedName = new StringBuilder();

        for (String word : words) {
            if (word.isEmpty()) continue;

            formattedName.append(Character.toUpperCase(word.charAt(0)))
                         .append(word.substring(1).toLowerCase())
                         .append(" ");
        }

        return formattedName.toString().trim();
    }
}

O que foi ajustado:

  1. Uso do do-while: Isso garante que o nome seja solicitado pelo menos uma vez e continua pedindo até que o nome tenha pelo menos 3 caracteres.

  2. Formatação do nome: A função formatString foi mantida para garantir que o nome seja formatado corretamente, com a primeira letra maiúscula e o restante em minúsculas.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.