Contar ocorrências de um caractere em uma string
1. Visão geral
Existem várias maneiras de contar o número de ocorrências de um caractere emString em Java.
Neste artigo rápido, vamos nos concentrar em alguns exemplos de como contar caracteres, primeiro, com a biblioteca Java principal e, em seguida, com outras bibliotecas e estruturas, como Spring e Guava.
2. Usando Core Java Lib
2.1. Abordagem Imperativa
Alguns desenvolvedores podem preferir usar o Java principal. Existem várias maneiras de contar o número de ocorrências de um caractere em uma String.
Vamos começar com uma abordagem simples / ingênua:
String someString = "elephant";
char someChar = 'e';
int count = 0;
for (int i = 0; i < someString.length(); i++) {
if (someString.charAt(i) == someChar) {
count++;
}
}
assertEquals(2, count);
Não é de surpreender que isso funcione, mas - também não é de surpreender - existem maneiras melhores de fazer isso.
2.2. Usando recursão
Uma solução menos óbvia, mas ainda interessante, é usar a recursão:
private static int countOccurences(
String someString, char searchedChar, int index) {
if (index >= someString.length()) {
return 0;
}
int count = someString.charAt(index) == searchedChar ? 1 : 0;
return count + countOccurences(
someString, searchedChar, index + 1);
}
Podemos invocar este método recursivo da seguinte maneira:useRecursionToCountChars(“elephant”, ‘e', 0)
2.4. Usando expressões regulares
Outra maneira seria usar expressões regulares:
Pattern pattern = Pattern.compile("[^e]*e");
Matcher matcher = pattern.matcher("elephant");
int count = 0;
while (matcher.find()) {
count++;
}
assertEquals(2, count);
Observe que esta solução é tecnicamente correta, mas abaixo do ideal, já que é um exagero usar expressões regulares muito poderosas para resolver um problema tão simples como encontrar o número de ocorrências de um caractere em uma string.
2.5. Usando recursos do Java 8
Novos recursos disponíveis no Java 8 podem ser muito úteis aqui.
Vamos usar streams e lambdas para implementar a contagem:
String someString = "elephant";
long count = someString.chars().filter(ch -> ch == 'e').count();
assertEquals(2, count);
long count2 = someString.codePoints().filter(ch -> ch == 'e').count();
assertEquals(2, count2);
Portanto, essa é claramente uma solução mais limpa e legível usando a biblioteca principal.
3. Usando bibliotecas externas
Vejamos agora algumas soluções que fazem uso de utilitários de bibliotecas externas.
3.1. UsandoStringUtils
Em geral, é sempre melhor usar uma solução existente em vez de inventar a nossa. A classecommons.lang.StringUtils nos fornece o métodocountMatches(), que pode ser usado para contar caracteres ou até mesmo sub-strings emString fornecidos.
Primeiro, precisamos incluir a dependência apropriada:
org.apache.commons
commons-lang3
3.5
Podemos encontrar a versão mais recente emMaven Central.
Agora vamos usarcountMatches() para contar o número de caracteres 'e' no literal String de “elefante”:
int count = StringUtils.countMatches("elephant", "e");
assertEquals(2, count);
3.2. Usando goiaba
A goiaba também pode ser útil na contagem de caracteres. Precisamos definir a dependência:
com.google.guava
guava
21.0
Podemos encontrar a versão mais recente emMaven Central.
Vamos ver como o Guava pode nos ajudar rapidamente a contar caracteres:
int count = CharMatcher.is('e').countIn("elephant");
assertEquals(2, count);
3.3. Usando Spring
Naturalmente, adicionar o Spring Framework em seu projeto apenas para contar os caracteres não faz sentido. No entanto, se já o temos em nosso projeto, precisamos apenas usar o métodocountOccurencesOf():
int count = StringUtils.countOccurrencesOf("elephant", "e");
assertEquals(2, count);
4. Conclusão
Neste tutorial rápido, focamos em várias maneiras de contar caracteres na String. Alguns deles foram projetados puramente em Java; algumas bibliotecas adicionais necessárias.
Nossa recomendação é usar utilitários já existentes deStringUtils, Guava ou Spring. No entanto, se alguém preferir usar apenas o Java simples, este artigo oferece algumas possibilidades de obter o mesmo resultado com o Java 8.
O código-fonte completo para esses exemplos está disponível emthis GitHub project.