Guide rapide du Java StringTokenizer

1. Vue d'ensemble

Dans cet article rapide, nous allons explorer une classe fondamentale en Java - le StringTokenizer .

2. StringTokenizer

La classe StringTokenizer nous aide à diviser les chaînes en plusieurs jetons.

StreamTokenizer fournit des fonctionnalités similaires mais la méthode de tokenisation est beaucoup plus simple que celle utilisée par la classe StreamTokenizer . Les méthodes de StringTokenizer ne font pas de distinction entre les identifiants, les nombres et les chaînes entre guillemets, ni reconnaissent et ignorent les commentaires.

L'ensemble des délimiteurs (les caractères qui séparent les jetons) peut être spécifié soit au moment de la création, soit sur une base par jeton.

3. Utilisation du StringTokenizer

L'exemple le plus simple d'utilisation de StringTokenizer sera de fractionner une chaîne en fonction des délimiteurs spécifiés.

Dans cet exemple rapide, nous allons diviser l'argument String et ajouter les jetons dans une liste :

public List getTokens(String str) { List tokens = new ArrayList(); StringTokenizer tokenizer = new StringTokenizer(str, ","); while (tokenizer.hasMoreElements()) { tokens.add(tokenizer.nextToken()); } return tokens; } 

Remarquez comment nous divisons la chaîne dans la liste des jetons en fonction du délimiteur ' , '. Puis dans la boucle, en utilisant la méthode tokens.add () ; nous ajoutons chaque jeton dans la ArrayList.

Par exemple, si un utilisateur donne une entrée comme « Bienvenue, à, baeldung.com », cette méthode doit renvoyer une liste contenant un fragment de trois mots comme « Bienvenue », « à » et « baeldung.com ».

3.1. Approche Java 8

Depuis StringTokenizer de Énumération interface, nous pouvons l' utiliser avec J ava de » Collections interface.

Si nous considérons l'exemple précédent, nous pouvons récupérer le même ensemble de jetons à l'aide de la méthode Collections.list () et de l' API Stream :

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

Ici, nous transmettons le StringTokenizer lui-même en tant que paramètre dans la méthode Collections.list () .

Il faut noter ici que, puisque l' énumération est un type Object , nous devons taper les jetons en type String (c'est-à-dire dépend de l'implémentation; si nous utilisons List of Integer / Float, nous devrons taper-cast avec Integer / Float ).

3.2. Variantes de StringTokenizer

StringTokenizer est livré avec deux constructeurs surchargés à côté du constructeur par défaut: StringTokenizer (String str) et StringTokenizer (String str, String delim, boolean returnDelims):

StringTokenizer (String str, String delim, boolean returnDelims) prend uneentrée booléenne supplémentaire. Si lavaleur booléenne est true , StringTokenizer considère le délimiteur lui-même comme un jeton et l'ajoute à son pool interne de jetons.

StringTokenizer (String str) est un raccourci pour l'exemple précédent; il appelle en interne l'autre constructeur avec un délimiteur codé en dur comme «\ t \ n \ r \ f» et la valeur booléenne comme false.

3.3. Personnalisation des jetons

StringTokenizer est également livré avec une méthode nextToken () surchargée qui prend un fragment de chaîne en entrée. Ce fragment String agit comme un ensemble supplémentaire de délimiteurs; basé sur quels jetons sont réorganisés à nouveau.

Par exemple, si nous pouvons passer ' e ' dans la méthode nextToken () pour casser davantage la chaîne en fonction du délimiteur ' e ':

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

Par conséquent, pour une chaîne donnée de ' Hello, baeldung.com ', nous produirons les jetons suivants:

H llo ba ldung.com

3.4. Longueur du jeton

Pour compter le nombre de jetons disponibles, nous pouvons utiliser la méthode de taille de StringTokenizer :

int tokenLength = tokens.size();

3.5. Lecture à partir d'un fichier CSV

Maintenant, essayons d'utiliser StringTokenizer dans un cas d'utilisation réel.

Il existe des scénarios dans lesquels nous essayons de lire des données à partir de fichiers CSV et d'analyser les données en fonction du délimiteur donné par l'utilisateur.

En utilisant StringTokenizer , nous pouvons facilement y arriver:

public List getTokensFromFile( String path , String delim ) { List tokens = new ArrayList(); String currLine = ""; StringTokenizer tokenizer; try (BufferedReader br = new BufferedReader( new InputStreamReader(Application.class.getResourceAsStream( "/" + path )))) { while (( currLine = br.readLine()) != null ) { tokenizer = new StringTokenizer( currLine , delim ); while (tokenizer.hasMoreElements()) { tokens.add(tokenizer.nextToken()); } } } catch (IOException e) { e.printStackTrace(); } return tokens; }

Ici, la fonction prend deux arguments; un comme nom de fichier CSV (c'est-à-dire lu dans le dossier resources [src -> main -> resources] ) et l'autre comme délimiteur.

Sur la base de ces deux arguments, les données CSV sont lues ligne par ligne et chaque ligne est tokenisée à l'aide de StringTokenizer .

Par exemple, nous avons mis le contenu suivant dans le CSV:

1|IND|India 2|MY|Malaysia 3|AU|Australia

Par conséquent, les jetons suivants doivent être générés:

1 IND India 2 MY Malaysia 3 AU Australia

3.6. Essai

Maintenant, créons un cas de test rapide:

public class TokenizerTest { private MyTokenizer myTokenizer = new MyTokenizer(); private List expectedTokensForString = Arrays.asList( "Welcome" , "to" , "baeldung.com" ); private List expectedTokensForFile = Arrays.asList( "1" , "IND" , "India" , "2" , "MY" , "Malaysia" , "3", "AU" , "Australia" ); @Test public void givenString_thenGetListOfString() { String str = "Welcome,to,baeldung.com"; List actualTokens = myTokenizer.getTokens( str ); assertEquals( expectedTokensForString, actualTokens ); } @Test public void givenFile_thenGetListOfString() List actualTokens = myTokenizer.getTokensFromFile( "data.csv", " }

4. Conclusion

Dans ce rapide didacticiel, nous avons examiné quelques exemples pratiques d'utilisation du noyau Java StringTokenizer .

Comme toujours, le code source complet est disponible à l'adresse over sur GitHub.