Перейти к содержанию

Подсчет количества вхождений символа в строке

Есть много способов подсчитать количество вхождений символов в строку в Java.

В этом кратком руководстве сосредоточимся на нескольких примерах подсчета символов – сначала с помощью основной библиотеки Java, а затем с другими библиотеками и платформами, такими как Spring и Guava.

Использование библиотеки Java Core

Императивный подход

Некоторые разработчики предпочитают использовать Java Core. Существует множество способов подсчета количества вхождений символа в строку. Начнем с простого подхода:

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

Неудивительно, что данный вариант сработает, но есть и лучшие способы.

Использование рекурсии

Менее очевидное, но все же интересное решение – использовать рекурсию:

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

Можно вызвать этот рекурсивный метод следующим образом: useRecursionToCountChars(“elephant”, ‘e’, 0).

Использование регулярных выражений

Другой способ – использовать регулярные выражения:

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

Обратите внимание, что это решение технически правильное, но неоптимальное, так как использование очень мощных регулярных выражений для решения такой простой задачи, как определение количества вхождений символа в строку, является излишним.

Использование функций Java 8

Здесь могут оказаться очень полезными новые функции, доступные в Java 8.

Давайте используем stream и лямбда-выражения для реализации подсчета:

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

Таким образом, это явно более чистое и читабельное решение, использующее основную библиотеку.

Использование внешних библиотек

Рассмотрим несколько решений, использующих утилиты из внешних библиотек.

Использование StringUtils

Всегда лучше использовать существующее решение, чем изобретать свое. Класс commons.lang.StringUtils предоставляет метод countMatches(), который можно использовать для подсчета символов или даже подстрок в заданной строке.

Во-первых, необходимо подключить соответствующую зависимость:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

Можно найти последнюю версию на Maven Central.

Теперь воспользуемся countMatches() для подсчета количества символов e в строковом литерале:

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

Использование Guava

Guava может быть полезна при подсчете символов. Необходимо определить зависимость:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

Можно найти последнюю версию на Maven Central.

Посмотрим, как Guava может быстро помочь подсчитать символы:

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

3.3. Использование Spring

Добавление Spring Framework в проект только для подсчета символов не имеет смысла.

Однако, если он уже есть в проекте, необходимо использовать метод countOccurencesOf():

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

Заключение

В этой статье мы сосредоточились на различных способах подсчета символов в строке. Некоторые из них были разработаны исключительно на Java; некоторые требовали дополнительных библиотек.

Рекомендуется использовать уже существующие утилиты от StringUtils, Guava или Spring. Тем не менее, эта статья предлагает некоторые возможности сделать это с помощью Java 8, если предпочтительнее использовать только Java.

Полный исходный код этих примеров доступен на GitHub.

Оригинал