Простейший способ подсчета появления каждого символа в строке с полной поддержкой Unicode (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) Версия Java 8 сполная поддержка Unicode находится в конце ответа.
Вывод
{A=3, B=3}
ОБНОВЛЕНИЕ: Для Java 8+ (не поддерживает символы из дополнительных плоскостей, например, эмодзи):
Map<String, Long> charCount = IntStream.range(0, word.length())
.mapToObj(i -> word.substring(i, i + 1))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
ОБНОВЛЕНИЕ 2: Также для Java 8 +.
Я былошибся, думая, что codePoints()
не был добавлен до Java 9. Он был добавлен в Java 8 к интерфейсу CharSequence
, поэтому он не отображается в javadoc для String
в Java 8 и отображается как , добавленное в Java 9 для более поздних версий javadoc.
Однако Character.toString(int codePoint)
метод не был добавлен до Java 11, поэтому для использования метода Character.toString(char c)
мы можем использовать chars()
в Java 8:
Map<String, Long> charCount = word.chars().mapToObj(c -> Character.toString((char) c))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
илидля полной поддержки Unicode, вкл.дополнительные плоскости, мы можем использовать codePoints()
и конструктор String(int[] codePoints, int offset, int count)
в Java 8:
Map<String, Long> charCount = word.codePoints()
.mapToObj(cp -> new String(new int[] { cp }, 0, 1))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));