Mostrar iniciais do nome

Bom, não to encontrando solução para esse código, tipo eu tenho que pegar um nome completo e imprimir as iniciais em letra maiúscula, tipo joão da silva neto “JSN” mas não to conseguindo as iniciais dos sobrenomes, o primeiro imprime certinho mas o problema tá no resto, não to conseguindo achar uma solução alguém pode me dar uma mãozinha pois sou bem iniciante rsrs

O que consegui até agora foi isso!!

public String acharIniciais (String nome) {
        String iniciaisNome = " ";
        char letra;
        int cont;
        for (cont = 0; cont < nome.length(); cont++) {
            letra = nome.charAt(0);
            iniciaisNome = String.valueOf(letra);
        }
        iniciaisNome = iniciaisNome.toUpperCase();
        return iniciaisNome;

public String acharIniciais(String nome) { StringBuilder iniciais = new StringBuilder(); for (char letra : nome.toCharArray()) { if (Character.isUpperCase(letra)) { iniciais.add(letra); } } return iniciais.toString(); }

Tem um jeito mais clean de resolver:

		String name ="JOão da silVa Neto";
		//normalizando a string para ficar sem acentos
		name = Normalizer.normalize(name, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", "");
		//retirando as preposições. Adicione outras se desejar.
		name = name.replaceAll("da|das|do|dos", "");
		//retirando todas as palvras exceto a primeira letra e transformando e maiusculo.
		name = name.replaceAll("\\B\\w\\s*", "").toUpperCase();

Muito obrigado pela ajuda, mas como disse antes sou bem iniciante em java, ainda não estudei nada sobre array, e ASCII rsrs então essas partes não entendi muito!!

name = name.replaceAll("\\B\\w\\s*", "").toUpperCase();

Também não vi nada sobre StringBuilder, mas vou da uma pesquisada pra ver se entendo a lógica por traz de tudo isso!
Mas mesmo assim agradeço muito vocês!!!

[quote=mtr]Também não vi nada sobre StringBuilder, mas vou da uma pesquisada pra ver se entendo a lógica por traz de tudo isso! Mas mesmo assim agradeço muito vocês!!!
[/quote]

O StringBuilder é só uma classe que concatena Strings de maneira ineficiente. Usar += na classe String dentro de um loop é muito lento. Mas aquele código é equivalente a esse aqui (porém mais rápido):

public String acharIniciais(String nome) { String iniciais = ""; for (char letra : nome.toCharArray()) { if (Character.isUpperCase(letra)) { iniciais += letra; } } return iniciais; }

[quote=mtr]Muito obrigado pela ajuda, mas como disse antes sou bem iniciante em java, ainda não estudei nada sobre array, e ASCII rsrs então essas partes não entendi muito!!

name = name.replaceAll("\\B\\w\\s*", "").toUpperCase();

[/quote]

Na verdade o que esse código faz é usar expressões regulares. De forma simplista os metacaracteres “\B\w\s*” estão dizendo o seguinte:
\B -> não olhe para o primeiro caracter da palavra.
\w -> olhe para a palavra
\s* -> olhe para o espaço
Juntando essas condições, ocorre o que falamos de casamento “matches”, ou seja:
Pegue todas as palavras (menos sua primeira letra) e espaços, então apague. Como a palavra nesse ponto era: “JOao silva Neto”, logo essa regex irá casar com:
"Oao ", "ilva ", “eto”
O método replaceAll vai localizar esse casamento na string e trocar o conteúdo por “”, ou seja, será apagado.

Resumindo, se você tiver oportunidade, estude expressões regulares, elas existem em praticamente todas as linguagens de programação, e servem para tratamento/transformação/pesquisa de textos. A primeira vista parece maluco esses comandos todos, mas torna teu código muito mais simples, evitando ter que fazer lógicas malucas com vários laços e ifs.

PS: Existem outras regexp para resolver teu problema, está foi apenas uma sugestão didática.