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

1. Обзор

Есть много способов подсчитать количество вхождений символа в строку в 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.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 () , который можно использовать для подсчета символов или даже подстрок в заданной строке .

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

 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.

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