Преброяване на появите на Char в низ

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 („слон“, „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“ в литерала на 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

Естествено добавянето на Spring Framework във вашия проект само за преброяване на символи няма смисъл. Ако обаче вече го имаме в нашия проект, просто трябва да използваме метода countOccurencesOf () :

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

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

В този бърз урок се фокусирахме върху различни начини за преброяване на символи в String. Някои от тях са проектирани изцяло на Java; някои изискват допълнителни библиотеки.

Нашата препоръка е да използвате вече съществуващи помощни програми от StringUtils , Guava или Spring. Ако обаче някой предпочита да използва само обикновена Java, тази статия предлага някои възможности да постигнете точно това с Java 8.

Пълният изходен код за тези примери е наличен в този проект на GitHub.