Počítanie slov v reťazci pomocou Javy

1. Prehľad

V tomto tutoriále si ešte prejdeme rôzne spôsoby počítania slov v danom reťazci pomocou Javy.

2. Pomocou StringTokenizer

Jednoduchý spôsob počítania slov v reťazci v Jave je použitie StringTokenizer trieda:

assertEquals (3, nový StringTokenizer ("tri slepé myši"). countTokens ()); assertEquals (4, nový StringTokenizer ("pozri \ thow \ ttyy \ trun"). countTokens ());

Poznač si to StringTokenizer automaticky starostlivosť o medzery pre nás, ako karty a návraty vozíka.

Môže sa to však na niektorých miestach zvlniť, napríklad pomlčky:

assertEquals (7, nový StringTokenizer („manželka farmára - bola z Albuquerque“). countTokens ());

V takom prípade by sme chceli, aby „manželka“ a „ona“ boli odlišné slová, ale keďže medzi nimi nie sú medzery, predvolené hodnoty nás zlyhajú.

Našťastie StringTokenizer dodáva s iným konštruktérom. Môžeme prejsť oddeľovačom do konštruktora, aby vyššie uvedené práce fungovali:

assertEquals (7, nový StringTokenizer ("manželka farmára - bola z Albuquerque", "-"). countTokens ());

To sa hodí, keď sa pokúsite spočítať slová v reťazci od niečo ako súbor CSV:

assertEquals (10, nový StringTokenizer ("robil si, ty, vidíš, taký, a, zrak, v, tvoj, život", ","). countTokens ());

Takže StringTokenizer je jednoduchý a dostane sa nás väčšinou tam.

Pozrime sa, čo nám regulárne výrazy navyše môžu poskytnúť.

3. Regulárne výrazy

Aby sme pre túto úlohu prišli so zmysluplným regulárnym výrazom, musíme si definovať, čo považujeme za slovo: slovo sa začína písmenom a končí sa medzerou alebo interpunkčným znamienkom.

Ak to vezmeme do úvahy, vzhľadom na reťazec, ktorý chceme urobiť, je tento reťazec rozdeliť vždy, keď narazíme na medzery a interpunkčné znamienka, a potom spočítať výsledné slová.

assertEquals (7, countWordsUsingRegex („manželka farmára - bola z Albuquerque“));

Pozrime sa trochu na to, aby sme videli silu regexu:

assertEquals (9, countWordsUsingRegex ("no & one # by malo% ever-write-like, this; but: well"));

Nie je praktické vyriešiť tento problém iba odovzdaním oddeľovača StringTokenizer pretože by sme museli definovať skutočne dlhý oddeľovač, aby sme sa pokúsili uviesť všetky možné interpunkčné znamienka.

Ukázalo sa, že naozaj nemusíme robiť veľa, odovzdanie regulárneho výrazu[\ pP \ s && [^ ']] +dorozdeliťmetódaStringtrieda urobí trik:

public static int countWordsUsingRegex (String arg) {if (arg == null) {return 0; } final String [] words = arg.split ("[\ pP \ s && [^ ']] +"); vrátiť slová.dĺžka; }

Regulárny výraz [\ pP \ s && [^ ']] + vyhľadá ľubovoľnú dĺžku interpunkčných znamienok alebo medzier a ignoruje interpunkčné znamienko apostrof.

Ak sa chcete dozvedieť viac informácií o regulárnych výrazoch, pozrite si Regulárne výrazy na Baeldungu.

4. Slučky a String API

Druhou metódou je mať príznak, ktorý sleduje slová, s ktorými sa stretli.

Vlajku sme nastavili na SLOVO keď narazíte na nové slovo a zvýšite počet slov, potom späť na SEPARÁTOR keď sa stretneme s neslovom (interpunkčné alebo medzerové znaky).

Tento prístup nám dáva rovnaké výsledky ako regulárne výrazy:

assertEquals (9, countWordsManually ("nikto & nikto # by nemal% -jako písať, toto ale dobre")); 

Musíme byť opatrní pri zvláštnych prípadoch, keď interpunkčné znamienka nie sú skutočne oddeľovačmi slov, napríklad:

assertEquals (6, countWordsManually ("manželka farmára - bola z Albuquerque"));

Chceme tu počítať „farmársky“ ako jedno slovo, hoci apostrof „“ je interpunkčné znamienko.

Vo verzii regexu sme mali flexibilitu definovať, čo sa pomocou regexu nekvalifikuje ako postava. Ale teraz, keď píšeme vlastnú implementáciu, toto vylúčenie musíme definovať samostatnou metódou:

private static boolean isAllowedInWord (char charAt) 

To, čo sme tu urobili, je teda umožniť jedným slovom všetky znaky a zákonné interpunkčné znamienka, v tomto prípade apostrof.

Túto metódu teraz môžeme použiť pri našej implementácii:

public static int countWordsManually (String arg) {if (arg == null) {return 0; } int príznak = SEPARÁTOR; počet int = 0; int stringLength = arg.length (); int znakCounter = 0; while (characterCounter <stringLength) {if (isAllowedInWord (arg.charAt (characterCounter)) && flag == SEPARATOR) {flag = WORD; počet ++; } else if (! isAllowedInWord (arg.charAt (characterCounter))) {flag = SEPARATOR; } znakCounter ++; } počet vrátení; }

Prvá podmienka označuje slovo, keď ho stretne, a zvyšuje počítadlo. Druhá podmienka skontroluje, či znak nie je písmeno, a nastaví príznak na SEPARÁTOR.

5. Záver

V tomto tutoriáli sme sa pozreli na spôsoby počítania slov pomocou niekoľkých prístupov. Môžeme vybrať ľubovoľné v závislosti od konkrétneho prípadu použitia.

Ako obvykle, zdrojový kód tohto tutoriálu nájdete na GitHub.


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