Erro na saida do CPF em java

Ola tudo bem
Estou com dificuldade em separar o CPF na saida para aparecer no console
exemplo:

CPF = 123.456.789.44
saida:
123
456
789
44

Segue a abaixo o código, só a finalização do CPF que não sai
Agradeço quem puder ajudar.

import java.util.Scanner;
import java.util.Locale;

public class Classe {
	
	public static void main(String[] args) {
		Scanner in = new Scanner (System.in);
		String meucpf = in.next();
		String pedacos = String.join("\n",meucpf.split("-")[0].split("\\."));
		System.out.println(pedacos);
	}
}

O dígito não imprime?
Ele ficou na posição 1 do array provavelmente. Vc está usando apenas a 0.

minha saida resulta em
123
456
789
ai falta mostrar 44
se eu mudo o array para [1] ele mostra somente o “44” e o começo não.

Tem outras formas de resolver, com Regex por ex., mas continuando o uso de split():

Scanner in = new Scanner (System.in);
String meucpf = in.next();
String[] pedacos = meucpf.replace(".", " ").replace("-", " ").split(" ");
System.out.println(String.join("\n", pedacos));

O CPF sempre será assim, com os separadores (123.456.789-44)?

Se for, não precisa ficar fazendo split e join, basta usar substring e pegar os pedaços da string que você quer:

String cpf = "123.456.789-44";
for (int inicio = 0, fim = 3; inicio < cpf.length(); inicio += 4, fim += 4) {
    if (fim > cpf.length()) // se passou do tamanho da string, ajusta o final
        fim = cpf.length();
    System.out.println(cpf.substring(inicio, fim));
}

Talvez o que vou falar agora seja micro-otimização, mas enfim: o split do Java não é lá muito eficiente porque sempre cria uma regex (que por si só é bem custosa), além de retornar um array com várias strings. E depois join ainda cria outra string juntando os elementos do array (sem contar cada chamada de replace, que também cria outra string).

Claro que substring também cria outra string, mas neste caso são criadas menos do que se usar replace, split e join. Claro também que, para strings pequenas rodando poucas vezes, a diferença será insignificante e imperceptível. Mas em sistemas maiores, com muitos dados sendo processados, isso pode começar a fazer diferença, então aprenda desde já a prestar atenção a esses detalhes :slight_smile:


Vale lembrar que este é um código “ingênuo”, pois não valida o tamanho da string nem nada (se tem números ou outros caracteres, se de fato é um CPF, etc), mas aí já é outra história…