Contar ocorrências de um caractere em uma string

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.