Підрахуйте випадки знака в струні

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' у літералі "elephant" String:

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 Framework у свій проект лише для підрахунку символів не має сенсу. Однак, якщо у нас це вже є в нашому проекті, нам просто потрібно використовувати метод countOccurencesOf () :

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

4. Висновок

У цьому короткому навчальному посібнику ми зосередилися на різних способах підрахунку символів у рядку. Деякі з них були розроблені суто на Java; деякі вимагали додаткових бібліотек.

Ми рекомендуємо використовувати вже існуючі утиліти від StringUtils , Guava або Spring. Однак, якщо хтось воліє використовувати лише звичайну Java, ця стаття пропонує деякі можливості для того, щоб досягти саме такої якості з Java 8.

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