Есть много способов достижения результата, но Regex не является инструментом для этого.Если вы хотите отфильтровать символы и убедиться, что будет подсчитано только [a-zA-Z]
, отфильтруйте нежелательные символы с помощью: string = string.replaceAll("[^a-zA-Z]", "");
.Теперь вернемся к вашей проблеме.
Вам нужно разделить String
на символы, а Map<Character, Integer>
, чтобы сохранить эти символы и их количество вхождений.Я предлагаю вам использовать LinkedHashMap<Character, Integer>
, который обеспечивает порядок вставки.
char[] charArray = string.toCharArray();
Map<Character, Integer> map = new LinkedHashMap<>();
Теперь переберите символы и сохраните их на карте.Если символ уже был сохранен, увеличьте значение на единицу.Этого можно достичь с помощью процедурного и традиционного for-loop
или начиная с Java 8, вы можете использовать java-stream .
До Java 8:
for (char ch: charArray) {
if(map.containsKey(ch)){
map.put(ch, map.get(ch)+1);
} else {
map.put(ch, 1);
}
}
После Java8 (string.split("")
возвращает массив строк, вам необходимо сопоставить их с символами):
Map<Character, Long> map = Arrays
.asList(string.split("")).stream().map(s -> s.charAt(0))
.collect(Collectors.groupingBy(s -> s, LinkedHashMap::new, Collectors.counting()));
В обоих случаях выходные данные будут одинаковыми:
System.out.println(map); // prints {t=2, e=1, s=1, i=1, n=1, g=1}