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.