Woorden tellen in een string met Java

1. Overzicht

In deze tutorial gaan we verder verschillende manieren om woorden in een bepaalde string te tellen met behulp van Java.

2. Met behulp van StringTokenizer

Een eenvoudige manier om woorden te tellen in een string in Java is om de StringTokenizer klasse:

assertEquals (3, nieuwe StringTokenizer ("drie blinde muizen"). countTokens ()); assertEquals (4, nieuwe StringTokenizer ("zie \ thow \ tthey \ trun"). countTokens ());

Let daar op StringTokenizer neemt automatisch zorg voor witruimte voor ons, zoals tabs en regelteruglopen.

Maar het kan op sommige plaatsen misgaan, zoals koppeltekens:

assertEquals (7, nieuwe StringTokenizer ("de boerin - ze kwam uit Albuquerque"). countTokens ());

In dit geval willen we dat "vrouw" en "zij" verschillende woorden zijn, maar aangezien er geen witruimte tussen zit, voldoen de standaardinstellingen niet.

Gelukkig, StringTokenizer wordt geleverd met een andere constructeur. We kunnen een scheidingsteken passeren in de constructor om het bovenstaande te laten werken:

assertEquals (7, nieuwe StringTokenizer ("de boerin - ze kwam uit Albuquerque", "-"). countTokens ());

Dit is handig wanneer u de woorden in een string probeert te tellen vanaf zoiets als een CSV-bestand:

assertEquals (10, nieuwe StringTokenizer ("did, you, ever, see, such a, sight, in, your, life", ","). countTokens ());

Zo, StringTokenizer is eenvoudig, en het brengt ons de meeste weg daarnaartoe.

Laten we eens kijken wat reguliere expressies voor extra pk's ons kunnen geven.

3. Reguliere expressies

Om voor deze taak een zinvolle reguliere expressie te kunnen bedenken, moeten we definiëren wat we als een woord beschouwen: een woord begint met een letter en eindigt met een spatie of een leesteken.

Met dit in gedachten willen we, gegeven een string, die string splitsen op elk punt dat we spaties en leestekens tegenkomen, en vervolgens de resulterende woorden tellen.

assertEquals (7, countWordsUsingRegex ("de boerin - zij kwam uit Albuquerque"));

Laten we de zaken een beetje opdrijven om de kracht van regex te zien:

assertEquals (9, countWordsUsingRegex ("niemand mag% ooit-schrijven-like, this; but: well"));

Het is niet praktisch om deze op te lossen door alleen een scheidingsteken door te geven aan StringTokenizer omdat we een heel lang scheidingsteken zouden moeten definiëren om te proberen alle mogelijke leestekens op te sommen.

Het blijkt dat we echt niet veel hoeven te doen, het passeren van de regex[\ pP \ s && [^ ']] +naar desplitsenmethode van deDraadklasse zal het lukken:

openbare statische int countWordsUsingRegex (String arg) {if (arg == null) {return 0; } final String [] words = arg.split ("[\ pP \ s && [^ ']] +"); return words.length; }

De regex [\ pP \ s && [^ ']] + vindt elke lengte van leestekens of spaties en negeert het apostrof-leesteken.

Voor meer informatie over reguliere expressies, zie Reguliere expressies op Baeldung.

4. Loops en de Draad API

De andere methode is om een ​​vlag te hebben die de woorden bijhoudt die zijn tegengekomen.

We zetten de vlag op WOORD wanneer u een nieuw woord tegenkomt en het aantal woorden verhoogt, en dan terug naar AFSCHEIDER wanneer we een niet-woord tegenkomen (leestekens of spaties).

Deze benadering geeft ons dezelfde resultaten als met reguliere expressies:

assertEquals (9, countWordsManually ("niemand # zou% ooit moeten schrijven, dit maar goed")); 

We moeten voorzichtig zijn met speciale gevallen waarin leestekens niet echt woordscheidingstekens zijn, bijvoorbeeld:

assertEquals (6, countWordsManually ("de boerin - zij kwam uit Albuquerque"));

Wat we hier willen is om "boer" als één woord te tellen, hoewel de apostrof "‘ "een leesteken is.

In de regex-versie hadden we de flexibiliteit om te definiëren wat niet kwalificeert als een teken met behulp van de regex. Maar nu we onze eigen implementatie schrijven, we moeten deze uitsluiting in een aparte methode definiëren:

privé statische boolean isAllowedInWord (char charAt) 

Dus wat we hier hebben gedaan, is om in een woord alle tekens en wettelijke leestekens toe te staan, in dit geval de apostrof.

We kunnen deze methode nu gebruiken in onze implementatie:

openbare statische int countWordsManually (String arg) {if (arg == null) {return 0; } int vlag = SEPARATOR; int count = 0; int stringLength = arg.length (); int characterCounter = 0; while (characterCounter <stringLength) {if (isAllowedInWord (arg.charAt (characterCounter)) && flag == SEPARATOR) {flag = WORD; tel ++; } else if (! isAllowedInWord (arg.charAt (characterCounter))) {flag = SEPARATOR; } characterCounter ++; } aantal keren terug; }

De eerste voorwaarde markeert een woord wanneer het er een tegenkomt, en verhoogt de teller. De tweede voorwaarde controleert of het teken geen letter is, en stelt de vlag in op AFSCHEIDER.

5. Conclusie

In deze tutorial hebben we gekeken naar manieren om woorden te tellen met behulp van verschillende benaderingen. We kunnen er een kiezen, afhankelijk van ons specifieke gebruik.

Zoals gewoonlijk is de broncode voor deze tutorial te vinden op GitHub.


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