Počítajte výskyt znaku v reťazci

1. Prehľad

Existuje mnoho spôsobov, ako spočítať počet výskytov znaku v a String v Jave.

V tomto rýchlom článku sa zameriame na niekoľko príkladov, ako počítať znaky, najskôr pomocou základnej knižnice Java a potom pomocou ďalších knižníc a rámcov, ako sú Spring a Guava.

2. Používanie Core Java Lib

2.1. Imperatívny prístup

Niektorí vývojári môžu uprednostniť použitie základnej verzie Java. Existuje mnoho spôsobov, ako spočítať počet výskytov znaku v reťazci.

Začnime jednoduchým / naivným prístupom:

Reťazec someString = "slon"; char someChar = 'e'; počet int = 0; for (int i = 0; i <someString.length (); i ++) {if (someString.charAt (i) == someChar) {count ++; }} assertEquals (2; pocet);

Niet divu, že to bude fungovať, ale - tiež nie je prekvapujúce, že existujú lepšie spôsoby, ako to urobiť.

2.2. Pomocou rekurzie

Menej zrejmé, ale stále zaujímavé riešenie je použitie rekurzie:

private static int countOccurences (String someString, char searchedChar, int index) {if (index> = someString.length ()) {return 0; } počet int = someString.charAt (index) == searchedChar? 1: 0; return count + countOccurences (someString, searchedChar, index + 1); }

Túto rekurzívnu metódu môžeme vyvolať nasledujúcim spôsobom: useRecursionToCountChars („slon“, „e“, 0)

2.4. Používanie regulárnych výrazov

Ďalším spôsobom by bolo použitie regulárnych výrazov:

Pattern pattern = Pattern.compile ("[^ e] * e"); Matcher matcher = pattern.matcher ("slon"); počet int = 0; while (matcher.find ()) {count ++; } assertEquals (2; pocet);

Len si všimnite, že toto riešenie je technicky správne, ale neoptimálne, pretože je prehnané používať veľmi silné regulárne výrazy na vyriešenie takého jednoduchého problému, ako je zistenie počtu výskytov znaku v reťazci.

2.5. Používanie funkcií Java 8

Tu môžu byť veľmi užitočné nové funkcie dostupné v prostredí Java 8.

Na implementáciu počtu použijeme prúdy a lambdy:

Reťazec someString = "slon"; long count = someString.chars (). filter (ch -> ch == 'e'). count (); assertEquals (2, count); long count2 = someString.codePoints (). filter (ch -> ch == 'e'). count (); assertEquals (2, count2);

Toto je teda jednoznačne čistejšie a čitateľnejšie riešenie využívajúce základnú knižnicu.

3. Používanie externých knižníc

Pozrime sa teraz na niekoľko riešení, ktoré využívajú pomocné programy z externých knižníc.

3.1. Použitím StringUtils

Všeobecne je vždy lepšie použiť existujúce riešenie namiesto vynájdenia toho nášho. The commons.lang.StringUtils trieda nám poskytuje countMatches () metóda, ktorú je možné použiť na počítanie znakov alebo dokonca podreťazcov v danom rozsahu String.

Najprv musíme zahrnúť príslušnú závislosť:

 org.apache.commons commons-lang3 3.5 

Najnovšiu verziu nájdeme na serveri Maven Central.

Poďme teraz použiť countMatches () spočítať počet znakov „e“ v reťazci literálu „slon“:

int count = StringUtils.countMatches ("slon", "e"); assertEquals (2, count);

3.2. Pomocou Guava

Guava môže byť užitočná aj pri počítaní znakov. Musíme definovať závislosť:

 com.google.guava guava 21.0 

Najnovšiu verziu nájdeme na serveri Maven Central.

Pozrime sa, ako nám Guava môže rýchlo pomôcť pri počítaní znakov:

int count = CharMatcher.is ('e'). countIn ("slon"); assertEquals (2, count);

3.3. Pomocou pružiny

Prirodzené pridanie jarného rámca do vášho projektu len kvôli počítaniu znakov nemá zmysel. Ak to však už v našom projekte máme, stačí použiť countOccurencesOf () metóda:

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

4. Záver

V tomto rýchlom výučbe sme sa zamerali na rôzne spôsoby počítania znakov v reťazci. Niektoré z nich boli navrhnuté čisto v prostredí Java; niektoré vyžadovali ďalšie knižnice.

Naše odporúčanie je použiť už existujúce pomocné programy od StringUtils, Guava alebo jar. Ak však chcete radšej používať iba obyčajnú Javu, tento článok ponúka niektoré možnosti, ako toho dosiahnuť s Java 8 rovnako dobre.

Kompletný zdrojový kód pre tieto príklady je k dispozícii v tomto projekte GitHub.


$config[zx-auto] not found$config[zx-overlay] not found