1. Обзор
Есть много способов подсчитать количество вхождений стула в String в Java.
В этом кратком руководстве мы сосредоточимся на нескольких примерах подсчета символов — сначала с основной библиотекой Java, а затем с другими библиотеками и фреймворками, такими как Spring и Guava.
Дальнейшее чтение:
Использование indexOf для поиска всех вхождений слова в строке
Чародейка из гуавы
Обработка строк с помощью Apache Commons Lang 3
2. Использование Core Java Lib
2.1. Императивный подход
Некоторые разработчики могут предпочесть использовать ядро Java. Существует множество способов подсчета количества вхождений символа в строку.
Давайте начнем с простого/наивного подхода:
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);
Неудивительно, что это сработает, но есть и лучшие способы сделать это.
2.2. Использование рекурсии
Менее очевидным, но все же интересным решением является использование рекурсии:
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); }
Мы можем вызвать этот рекурсивный метод следующим образом: используйте рекурсию для подсчета символов(“слон”, “e”, 0) .
2.3. Использование Регулярных Выражений
Другим способом было бы использование регулярных выражений:
Pattern pattern = Pattern.compile("[^e]*e"); Matcher matcher = pattern.matcher("elephant"); int count = 0; while (matcher.find()) { count++; } assertEquals(2, count);
Просто обратите внимание, что это решение технически правильно, но неоптимально, так как использование очень мощных регулярных выражений для решения такой простой задачи, как нахождение количества вхождений символа в строке, является излишним.
2.4. Использование функций Java 8
Новые функции, доступные в Java 8, могут быть очень полезны здесь.
Давайте использовать потоки и лямбды для реализации подсчета:
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);
Таким образом, это явно более чистое и читаемое решение, использующее основную библиотеку.
3. Использование Внешних Библиотек
Давайте теперь рассмотрим несколько решений, которые используют утилиты из внешних библиотек.
3.1. Использование стрингутилов
В общем, всегда лучше использовать существующее решение, а не изобретать собственное. The commons.lang.Класс StringUtils предоставляет нам метод countMatches () , который может использоваться для подсчета символов или даже подстрок в данной Строке .
Во-первых, нам нужно включить соответствующую зависимость:
org.apache.commons commons-lang3 3.11
Мы можем найти последнюю версию на Maven Central .
Теперь давайте использовать count Matches() для подсчета количества символов e в строковом литерале “слон”.:
int count = StringUtils.countMatches("elephant", "e"); assertEquals(2, count);
3.2. Использование гуавы
Гуава также может быть полезна при подсчете символов. Нам нужно определить зависимость:
com.google.guava guava 21.0
Мы можем найти последнюю версию на Maven Central .
Давайте посмотрим, как Гуава может быстро помочь нам подсчитать чарс:
int count = CharMatcher.is('e').countIn("elephant"); assertEquals(2, count);
3.3. Использование пружины
Естественно, добавление фреймворка Spring в наш проект только для подсчета символов не имеет смысла.
Однако, если он уже есть в нашем проекте, нам просто нужно использовать метод count вхождений() :
int count = StringUtils.countOccurrencesOf("elephant", "e"); assertEquals(2, count);
4. Заключение
В этой статье мы сосредоточились на различных способах подсчета символов в строке. Некоторые из них были разработаны исключительно на Java; некоторые требовали дополнительных библиотек.
Мы рекомендуем использовать уже существующие утилиты из StringUtils , Guava или Spring. Тем не менее, эта статья предлагает некоторые возможности, чтобы сделать это с помощью Java 8, если предпочтительно использовать только обычную Java.
Полный исходный код для этих примеров доступен в этом проекте GitHub .