Szavak számolása stringben Java-val

1. Áttekintés

Ebben az oktatóanyagban át fogunk térni egy adott karakterláncban a szavak számlálásának különböző módjai Java használatával.

2. Használata StringTokenizer

A szavak számlálásának egyszerű módja egy sztringben a Java-ban a StringTokenizer osztály:

assertEquals (3, új StringTokenizer ("három vak egér"). countTokens ()); assertEquals (4, új StringTokenizer ("lásd \ thow \ tthey \ trun"). countTokens ());

Vegye figyelembe, hogy StringTokenizer automatikusan veszi a szóközök gondozása számunkra, mint a fülek és a kocsivissza.

De előfordulhat, hogy egyes helyeken nem működik, például kötőjelek:

assertEquals (7, új StringTokenizer ("a gazda felesége - Albuquerque-ből származott"). countTokens ());

Ebben az esetben azt szeretnénk, ha a „feleség” és „ő” különböző szavak lennének, de mivel nincs szóköz közöttük, az alapértelmezettek kudarcot vallanak.

Szerencsére, StringTokenizer egy másik kivitelezővel szállít. Áthaladhatunk egy határolóval a konstruktorba a fenti munka érdekében:

assertEquals (7, új StringTokenizer ("a gazda felesége - Albuquerque-ből származott", "-"). countTokens ());

Ez jól jön, ha megpróbálja megszámolni a szavakat egy stringben valami CSV-fájl:

assertEquals (10, új StringTokenizer ("látta, látta, látta, látta, életében", ","). countTokens ());

Így, StringTokenizer egyszerű, és ez vezet minket az út nagy részébe.

Lássuk mégis, milyen extra lóerőt adhatnak nekünk a reguláris kifejezések.

3. Reguláris kifejezések

Annak érdekében, hogy értelmes szabályos kifejezést tudjunk előállítani ehhez a feladathoz, meg kell határoznunk, mit tekintünk egy szónak: egy szó betűvel kezdődik és szóközzel vagy írásjelekkel végződik.

Ezt szem előtt tartva, egy sztringet figyelembe véve, azt akarjuk tenni, hogy ezt a húrot felosztjuk minden ponton, ahol szóközökkel és írásjelekkel találkozunk, majd megszámoljuk az eredményül kapott szavakat.

assertEquals (7, countWordsUsingRegex ("a gazda felesége - Albuquerque-ből származott"));

Tekerjük fel egy kicsit a dolgokat, hogy lássuk a regex erejét:

assertEquals (9, countWordsUsingRegex ("senkinek nem szabad% -nak% -ig írni, ez; de: jól"));

Nem célszerű ezt megoldani, ha csak egy határolót adunk át neki StringTokenizer mivel meg kell határoznunk egy nagyon hosszú elválasztót, hogy megpróbáljuk felsorolni az összes lehetséges írásjelet.

Kiderült, hogy tényleg nem kell sokat tennünk, a regex átadása[\ pP \ s && [^ ']] +hozhasítottmódszereHúrosztály trükközni fog:

public static int countWordsUsingRegex (string arg) {if (arg == null) {return 0; } végső karakterlánc [] szó = arg.split ("[\ pP \ s && [^ ']] +"); visszatérő szavak.hossz; }

A regex [\ pP \ s && [^ ']] + bármilyen hosszúságú jeleket vagy szóközöket talál, és figyelmen kívül hagyja az aposztrófjeleket.

Ha többet szeretne megtudni a reguláris kifejezésekről, olvassa el a Reguláris kifejezések a Baeldungon című cikket.

4. Hurkok és a Húr API

A másik módszer egy olyan zászló, amely nyomon követi a felmerült szavakat.

A zászlót állítottuk SZÓ amikor új szóval találkozik, és növeli a szószámot, akkor vissza a SZÉTVÁLASZTÓ amikor nem szóval (írásjelekkel vagy szóközökkel) találkozunk.

Ez a megközelítés ugyanazokat az eredményeket adja nekünk, amelyeket rendszeres kifejezésekkel kaptunk:

assertEquals (9, countWordsManually ("senkinek nem szabad% -nak% -ig írni, ez de jól")); 

Óvatosnak kell lennünk olyan speciális esetekkel, amikor az írásjelek nem igazán elválasztó szavak, például:

assertEquals (6, countWordsManually ("a gazda felesége - Albuquerque-ből származott"));

Itt azt akarjuk, hogy a „gazda” -t egy szónak számítsuk, bár a „” jelű írásjel írásjel.

A regex változatban a regex segítségével rugalmasan határozhattuk meg, hogy mi nem minősül karakternek. De most, amikor a saját megvalósításunkat írjuk, ezt a kizárást külön módszerben kell meghatároznunk:

privát statikus logikai érték engedélyezettInWord (char charAt) 

Tehát itt azt tettük, hogy egy szóval engedélyezzük az összes karaktert és a jogi írásjeleket, ebben az esetben az aposztrófot.

Most ezt a módszert használhatjuk megvalósításunk során:

public static int countWordsManually (String arg) {if (arg == null) {return 0; } int flag = SZeparátor; int szám = 0; int stringLength = arg.length (); int karakterSzámláló = 0; while (characterCounter <stringLength) {if (isAllowedInWord (arg.charAt (characterCounter)) && flag == SEPARATOR) {flag = WORD; szám ++; } else if (! isAllowedInWord (arg.charAt (characterCounter))) {flag = SZeparátor; } characterCounter ++; } visszatérés száma; }

Az első feltétel egy szót jelöl, amikor találkozik, és növeli a számlálót. A második feltétel ellenőrzi, hogy a karakter nem betű-e, és a zászlót állítja SZÉTVÁLASZTÓ.

5. Következtetés

Ebben az oktatóanyagban többféle megközelítés segítségével megvizsgáltuk a szavak számlálásának módjait. Bármelyiket kiválaszthatjuk az adott felhasználási esetünktől függően.

Szokás szerint az oktatóanyag forráskódja megtalálható a GitHubon.


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