Brojanje riječi u nizu s Javom

1. Pregled

U ovom uputstvu idemo dalje različiti načini brojanja riječi u zadanom nizu koristeći Javu.

2. Korištenje StringTokenizer

Jednostavan način brojanja riječi u nizu u Javi je koristiti StringTokenizer razred:

assertEquals (3, novi StringTokenizer ("tri slijepa miša"). countTokens ()); assertEquals (4, novi StringTokenizer ("vidi \ thow \ tthey \ trun"). countTokens ());

Imajte na umu da StringTokenizer automatski uzima briga o razmaku za nas, poput kartica i vraćanja kočija.

Ali, ponegdje bi se moglo izgubiti, poput crtica:

assertEquals (7, novi StringTokenizer ("farmerova supruga - bila je iz Albuquerquea"). countTokens ());

U ovom bismo slučaju željeli da "supruga" i "ona" budu različite riječi, ali budući da između njih nema razmaka, zadane vrijednosti nas zatajiti.

Srećom, StringTokenizer brodovi s drugim konstruktorom. Možemo proći graničnik u konstruktor kako bi gore navedeni posao radio:

assertEquals (7, novi StringTokenizer ("farmerova supruga - bila je iz Albuquerquea", "-"). countTokens ());

To vam dobro dođe kada pokušavate brojati riječi u nizu od nešto poput CSV datoteke:

assertEquals (10, novi StringTokenizer ("jesi li, jesi li ikad vidio takav, vid, u, svom, životu", ","). countTokens ());

Tako, StringTokenizer je jednostavan i vodi nas većinom do tamo.

Pogledajmo ipak što nam mogu pružiti dodatni regularni izrazi.

3. Regularni izrazi

Da bismo smislili smislen regularni izraz za ovaj zadatak, moramo definirati što smatramo riječju: riječ započinje slovom, a završava razmakom ili interpunkcijskim znakom.

Imajući to na umu, s obzirom na niz, ono što želimo učiniti je podijeliti taj niz u svakoj točki na koje naiđemo razmaci i interpunkcijski znakovi, a zatim prebrojati rezultirajuće riječi.

assertEquals (7, countWordsUsingRegex ("farmerova supruga - bila je iz Albuquerquea));

Idemo malo pokrenuti stvari da vidimo snagu regularnog izraza:

assertEquals (9, countWordsUsingRegex ("nitko i nitko # ne bi smio% ikad pisati, ovo; ali: dobro"));

Nije praktično riješiti ovaj kroz samo dodavanje graničnika do StringTokenizer budući da bismo morali definirati stvarno dugački graničnik da bismo pokušali navesti sve moguće interpunkcijske znakove.

Ispada da stvarno ne moramo puno raditi, prolazeći regularni izraz[\ pP \ s && [^ ']] +premapodjelametodaNizrazred će učiniti trik:

javni statički int countWordsUsingRegex (niz arg) {if (arg == null) {return 0; } završni niz [] riječi = arg.split ("[\ pP \ s && [^ ']] +"); vratiti riječi.dužina; }

Redovni izraz [\ pP \ s && [^ ']] + pronalazi bilo koju dužinu interpunkcijskih znakova ili razmaka i ignorira interpunkcijski znak apostrofa.

Da biste saznali više o regularnim izrazima, pogledajte Regularni izrazi na Baeldungu.

4. Petlje i Niz API

Druga metoda je imati zastavicu koja prati riječi koje su se susrele.

Postavili smo zastavu RIJEČ kada naiđete na novu riječ i povećajte broj riječi, a zatim se vratite na SEPARATOR kad naiđemo na ne-riječ (interpunkcijski ili razmakni znakovi).

Ovaj pristup daje nam iste rezultate koje smo dobili s regularnim izrazima:

assertEquals (9, countWordsManually ("nitko i nitko # ne bi smio% ikad pisati, ovo ali dobro")); 

Moramo biti oprezni s posebnim slučajevima kada interpunkcijski znakovi zapravo nisu razdvajači riječi, na primjer:

assertEquals (6, countWordsManually ("farmerova supruga - bila je iz Albuquerquea"));

Ono što ovdje želimo jest računati „farmere“ kao jednu riječ, iako je apostrof „‘ “interpunkcijski znak.

U verziji regularnog izraza imali smo fleksibilnost pri definiranju onoga što se ne kvalificira kao znak pomoću regularnog izraza. Ali sada kada pišemo vlastitu implementaciju, to izuzeće moramo definirati zasebnom metodom:

privatna statička logička vrijednost isAllowedInWord (char charAt) 

Dakle, ono što smo ovdje učinili jest da jednom riječju dopustimo sve znakove i zakonske interpunkcijske znakove, u ovom slučaju apostrof.

Sada možemo koristiti ovu metodu u našoj implementaciji:

javni statički int countWordsManually (niz arg) {if (arg == null) {return 0; } int zastava = SEPARATOR; broj brojeva = 0; int stringLength = arg.length (); int characterCounter = 0; while (CharacCounter <stringLength) {if (isAllowedInWord (arg.charAt (characterCounter)) && flag == SEPARATOR) {flag = WORD; brojati ++; } inače if (! isAllowedInWord (arg.charAt (characterCounter)))) {zastava = SEPARATOR; } characterCounter ++; } count count; }

Prvi uvjet označava riječ kad je naiđe i povećava brojač. Drugi uvjet provjerava je li znak slovo i postavlja zastavicu na SEPARATOR.

5. Zaključak

U ovom smo tutorijalu pogledali načine brojanja riječi koristeći nekoliko pristupa. Možemo odabrati bilo koji ovisno o našem konkretnom slučaju korištenja.

Kao i obično, izvorni kod za ovu lekciju možete pronaći na GitHubu.


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