Рубрики
Без рубрики

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

Узнайте, как подсчитывать символы с помощью основной библиотеки Java, а также с помощью библиотек и фреймворков, таких как Spring и Guava.

Автор оригинала: baeldung.

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 .