Beknopte handleiding voor de Java StringTokenizer

1. Overzicht

In dit korte artikel gaan we een fundamentele klasse in Java verkennen: de StringTokenizer.

2. StringTokenizer

De StringTokenizer klasse helpt ons splitsen Snaren in meerdere tokens.

StreamTokenizer biedt vergelijkbare functionaliteit, maar de tokenisatiemethode is veel eenvoudiger dan degene die wordt gebruikt door de StreamTokenizer klasse. Methodes van StringTokenizer maak geen onderscheid tussen ID's, cijfers en aanhalingstekens, en herken geen opmerkingen en sla deze over.

De set scheidingstekens (de tekens die de tokens scheiden) kan worden gespecificeerd tijdens het maken of per token.

3. Gebruik de StringTokenizer

Het eenvoudigste voorbeeld van het gebruik van StringTokenizer zal zijn om een ​​te splitsen Draad gebaseerd op gespecificeerde scheidingstekens.

In dit korte voorbeeld gaan we het argument String splitsen en de tokens aan een lijst toevoegen:

openbare lijst getTokens (String str) {List tokens = new ArrayList (); StringTokenizer tokenizer = nieuwe StringTokenizer (str, ","); while (tokenizer.hasMoreElements ()) {tokens.add (tokenizer.nextToken ()); } retourneerfiches; } 

Merk op hoe we de Draad in de lijst met tokens op basis van scheidingsteken ‘,‘. Vervolgens in de lus, met behulp van tokens.add () methode; we voegen elk token toe aan de ArrayList.

Als een gebruiker bijvoorbeeld invoer invoert als 'Welkom bij baeldung.com", Deze methode zou een lijst moeten retourneren die een fragment van drie woorden bevat als"Welkom“, “naar"En"baeldung.com“.

3.1. Java 8-benadering

Sinds StringTokenizer werktuigen Opsomming interface, kunnen we het gebruiken met Java‘S Collecties koppel.

Als we het eerdere voorbeeld bekijken, kunnen we dezelfde set tokens ophalen met Collections.list () methode en Stroom API:

openbare lijst getTokensWithCollection (String str) {return Collections.list (new StringTokenizer (str, ",")). stream () .map (token -> (String) token) .collect (Collectors.toList ()); }

Hier passeren we de StringTokenizer zichzelf als een parameter in het Collections.list () methode.

Punt om op te merken is dat, aangezien de Opsomming is een Voorwerp type, we moeten de tokens typen naar Draad type (d.w.z. hangt af van de implementatie; of we Lijst van Geheel getal / zwevend dan moeten we typen met Geheel getal / zwevend).

3.2. Varianten van StringTokenizer

StringTokenizer wordt geleverd met twee overbelaste constructors naast de standaard constructor: StringTokenizer (String str) en StringTokenizer (String str, String delim, boolean returnDelims):

StringTokenizer (String str, String delim, boolean returnDelims) kost een extra boolean invoer. Als het boolean waarde is waar, dan StringTokenizer beschouwt het scheidingsteken zelf als een token en voegt het toe aan zijn interne pool van tokens.

StringTokenizer (String str) is een snelkoppeling voor het vorige voorbeeld; het roept intern de andere constructor aan met een hard gecodeerd scheidingsteken als "\ T \ n \ r \ f" en de booleaanse waarde als false.

3.3. Token-aanpassing

StringTokenizer komt ook met een overbelast volgendeToken () methode die een stringfragment als invoer nodig heeft. Dit Draad fragment fungeert als een extra set scheidingstekens; op basis waarvan tokens opnieuw worden georganiseerd.

Als we bijvoorbeeld kunnen slagen ‘e' in de volgendeToken () methode om de string verder te breken op basis van het scheidingsteken ‘e‘:

tokens.add (tokenizer.nextToken ("e"));

Vandaar dat voor een gegeven reeks ‘Hallo, baeldung.com‘We zullen de volgende tokens produceren:

H llo ba ldung.com

3.4. Token Lengte

Om het beschikbare aantal tokens te tellen, kunnen we gebruiken StringTokenizer‘S grootte methode:

int tokenLength = tokens.size ();

3.5. Lezen van CSV-bestand

Laten we nu proberen StringTokenizer in een echte use case.

Er zijn scenario's waarin we proberen gegevens uit CSV-bestanden te lezen en de gegevens te parseren op basis van het door de gebruiker opgegeven scheidingsteken.

Gebruik makend van StringTokenizerkunnen we er gemakkelijk komen:

openbare lijst getTokensFromFile (String-pad, String-scheiding) {List-tokens = nieuwe ArrayList (); String currLine = ""; StringTokenizer-tokenizer; probeer (BufferedReader br = nieuwe BufferedReader (nieuwe InputStreamReader (Application.class.getResourceAsStream ("/" + pad))))) {while ((currLine = br.readLine ())! = null) {tokenizer = nieuwe StringTokenizer (currLine, afbakening); while (tokenizer.hasMoreElements ()) {tokens.add (tokenizer.nextToken ()); }}} catch (IOException e) {e.printStackTrace (); } retourneerfiches; }

Hier heeft de functie twee argumenten nodig; één als CSV-bestandsnaam (d.w.z. gelezen uit de bronnen [src -> main -> bronnen] map) en de andere als scheidingsteken.

Op basis van deze twee argumenten worden de CSV-gegevens regel voor regel gelezen en wordt elke regel getokeniseerd met StringTokenizer.

We hebben bijvoorbeeld de volgende inhoud in de CSV geplaatst:

1 | IND | India 2 | MY | Maleisië 3 | AU | Australië

Daarom moeten de volgende tokens worden gegenereerd:

1 IND India 2 MY Maleisië 3 AU Australië

3.6. Testen

Laten we nu een snelle testcase maken:

openbare klasse TokenizerTest {privé MyTokenizer myTokenizer = nieuwe MyTokenizer (); privélijst verwachteTokensForString = Arrays.asList ("Welkom", "naar", "baeldung.com"); privélijst verwachteTokensForFile = Arrays.asList ("1", "IND", "India", "2", "MY", "Maleisië", "3", "AU", "Australië"); @Test openbare leegte gegevenString_thenGetListOfString () {String str = "Welkom bij baeldung.com"; Lijst actualTokens = myTokenizer.getTokens (str); assertEquals (verwachteTokensForString, actualTokens); } @Test openbare leegte gegevenFile_thenGetListOfString () Lijst actualTokens = myTokenizer.getTokensFromFile ("data.csv", "}

4. Conclusie

In deze korte tutorial hebben we enkele praktische voorbeelden bekeken van het gebruik van de kern Java StringTokenizer.

Zoals altijd is de volledige broncode beschikbaar op GitHub.