Basta fazer um loop pelos caracteres da string, testar se ele é letra maiúscula, minúscula ou dígito, e atualizar os respectivos contadores:
String texto = "O rato roeu a roupa do rei de Roma 123";
int maiusculas = 0, minusculas = 0, numeros = 0;
for (int i = 0; i < texto.length(); i++) { // para todos os caracteres da string
char c = texto.charAt(i); // pegar o caractere
if (Character.isUpperCase(c)) {
maiusculas++;
} else if (Character.isLowerCase(c)) {
minusculas++;
} else if (Character.isDigit(c)) {
numeros++;
}
}
System.out.printf("Total: %d letras maiúsculas, %d letras minúsculas, %d números\n", maiusculas, minusculas, numeros);
Vale lembrar que os métodos isLowerCase
e isUpperCase
também consideram letras de outros alfabetos (como por exemplo, 𐐌
e 𐐒
). Só que estas letras possuem code points acima de U+FFFF (ou seja, não cabem em um char
e acabam ocupando dois - leia aqui para entender melhor).
Se a string só tiver textos em português, pode usar o código acima. Mas para uma solução mais geral, pode mudar para:
String texto = "abc𐐌";
int maiusculas = 0, minusculas = 0, numeros = 0;
System.out.println(texto.codePointCount(0, texto.length()));
for (int i = 0; i < texto.codePointCount(0, texto.length()); i++) { // para todos os caracteres da string
int c = texto.codePointAt(i); // pegar o caractere
System.out.println("vendo " + c );
if (Character.isUpperCase(c)) {
maiusculas++;
} else if (Character.isLowerCase(c)) {
minusculas++;
} else if (Character.isDigit(c)) {
numeros++;
}
}
System.out.printf("Total: %d letras maiúsculas, %d letras minúsculas, %d números\n", maiusculas, minusculas, numeros);
Coloquei o caractere 𐐌
na string para mostrar a diferença: teste com o primeiro código e ele dirá que tem zero letras maiúsculas, já usando o código acima, ele informa corretamente que há 1 letra maiúscula.