Считать вхождения строки в строке

Считать появления символа в строке

1. обзор

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

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

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

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

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

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

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

assertEquals(2, count);

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

2.5. Использование возможностей 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. ИспользуяStringUtils

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

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


    org.apache.commons
    commons-lang3
    3.5

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

Давайте теперь используемcountMatches() для подсчета количества символов «e» в строковом литерале «слон»:

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

3.2. Использование гуавы

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


    com.google.guava
    guava
    21.0

Последнюю версию можно найти на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);

4. Заключение

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

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

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