Compter les occurrences d’un caractère dans une chaîne

Compter les occurrences d'un personnage dans une chaîne

1. Vue d'ensemble

Il existe de nombreuses façons de compter le nombre d'occurrences d'un caractère dans unString en Java.

Dans cet article rapide, nous allons nous concentrer sur quelques exemples de comptage de caractères, d'abord avec la bibliothèque Java principale, puis avec d'autres bibliothèques et frameworks tels que Spring et Guava.

2. Utilisation de Core Java Lib

2.1. Approche impérative

Certains développeurs préféreront peut-être utiliser le noyau Java. Il existe plusieurs façons de compter le nombre d'occurrences d'un caractère dans une chaîne.

Commençons par une approche simple / naïve:

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);

Sans surprise, cela fonctionnera, mais - sans surprise -, il existe de meilleures façons de le faire.

2.2. Utilisation de la récursivité

Une solution moins évidente, mais toujours intéressante, consiste à utiliser la récursivité:

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);
}

Nous pouvons invoquer cette méthode récursive de la manière suivante:useRecursionToCountChars(“elephant”, ‘e', 0)

2.4. Utiliser des expressions régulières

Une autre façon serait d'utiliser des expressions régulières:

Pattern pattern = Pattern.compile("[^e]*e");
Matcher matcher = pattern.matcher("elephant");
int count = 0;
while (matcher.find()) {
    count++;
}

assertEquals(2, count);

Notez simplement que cette solution est techniquement correcte, mais sous-optimale, car il est excessif d’utiliser les expressions régulières très puissantes pour résoudre un problème aussi simple que celui de trouver le nombre d’occurrences d’un caractère dans une chaîne.

2.5. Utilisation des fonctionnalités de Java 8

Les nouvelles fonctionnalités disponibles dans Java 8 peuvent être très utiles ici.

Utilisons des flux et des lambdas pour implémenter le décompte:

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);

Il s'agit donc clairement d'une solution plus propre et plus lisible utilisant la bibliothèque principale.

3. Utilisation de bibliothèques externes

Examinons maintenant quelques solutions qui utilisent des utilitaires de bibliothèques externes.

3.1. Utilisation deStringUtils

En général, il est toujours préférable d'utiliser une solution existante au lieu d'inventer la nôtre. La classecommons.lang.StringUtils nous fournit la méthodecountMatches(), qui peut être utilisée pour compter les caractères ou même les sous-chaînes dans desString donnés.

Premièrement, nous devons inclure la dépendance appropriée:


    org.apache.commons
    commons-lang3
    3.5

Nous pouvons trouver la dernière version surMaven Central.

Utilisons maintenantcountMatches() pour compter le nombre de caractères «e» dans la chaîne littérale «éléphant»:

int count = StringUtils.countMatches("elephant", "e");
assertEquals(2, count);

3.2. Utilisation de goyave

La goyave peut également être utile pour compter les caractères. Nous devons définir la dépendance:


    com.google.guava
    guava
    21.0

Nous pouvons trouver la dernière version surMaven Central.

Voyons comment Guava peut nous aider rapidement à compter les caractères:

int count = CharMatcher.is('e').countIn("elephant");
assertEquals(2, count);

3.3. Utiliser Spring

Naturellement, ajouter Spring Framework à votre projet juste pour compter les caractères n'a aucun sens. Cependant, si nous l'avons déjà dans notre projet, il suffit d'utiliser la méthodecountOccurencesOf():

int count = StringUtils.countOccurrencesOf("elephant", "e");
assertEquals(2, count);

4. Conclusion

Dans ce rapide didacticiel, nous avons étudié différentes manières de compter les caractères dans la chaîne. Certains d'entre eux ont été conçus uniquement en Java; certaines nécessitaient des bibliothèques supplémentaires.

Notre recommandation est d'utiliser les utilitaires déjà existants deStringUtils, Guava ou Spring. Toutefois, si l’on préfère utiliser uniquement du langage Java simple, cet article offre quelques possibilités pour réussir aussi bien avec Java 8.

Le code source complet de ces exemples est disponible enthis GitHub project.