Le moyen le plus simple de compter les occurrences de chaque caractère dans une chaîne, avec un support Unicode complet (Java 11+) 1 :
String word = "AAABBB";
Map<String, Long> charCount = word.codePoints().mapToObj(Character::toString)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
System.out.println(charCount);
1) La version de Java 8 avec le support complet d'Unicode est à la fin de la réponse.
Sortie
{A=3, B=3}
UPDATE : Pour Java 8+ (ne prend pas en charge les caractères des plans supplémentaires, par exemple les emoji) :
Map<String, Long> charCount = IntStream.range(0, word.length())
.mapToObj(i -> word.substring(i, i + 1))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
UPDATE 2 : Également pour Java 8+.
Je me suis trompé en pensant que codePoints()
n'a pas été ajouté avant Java 9. Il a été ajouté dans Java 8 à la fonction CharSequence
de sorte qu'il n'apparaît pas dans la javadoc de l'interface String
en Java 8, et se présente comme [ajouté dans Java 9](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#codePoints()) pour les versions ultérieures de la javadoc.
Cependant, le Character.toString(int codePoint)
n'a pas été ajoutée avant Java 11, donc pour utiliser la méthode Character.toString(char c)
nous pouvons utiliser la méthode chars()
en Java 8 :
Map<String, Long> charCount = word.chars().mapToObj(c -> Character.toString((char) c))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Ou pour un support Unicode complet, y compris les plans supplémentaires, nous pouvons utiliser codePoints()
et le String(int[] codePoints, int offset, int count)
en Java 8 :
Map<String, Long> charCount = word.codePoints()
.mapToObj(cp -> new String(new int[] { cp }, 0, 1))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));