Перейти к основному содержимому

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

· 3 мин. чтения

Задача: Наибольшая подстрока без повторений

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

ANDROMEDA 42

1. Обзор

Есть много способов подсчитать количество вхождений char в 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("слон", '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. Использование StringUtils

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

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

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

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

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

<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 Framework в наш проект только для подсчета символов не имеет смысла.

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

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

4. Вывод

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

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

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