web-dev-qa-db-fra.com

tokenizer de chaîne en Java

J'ai un fichier texte qui contient des données séparées par '|'. Je dois obtenir chaque champ (séparé par '|') et le traiter. Le fichier texte peut être affiché comme ci-dessous:

ABC | DEF || FGHT

J'utilise tokenizer de chaîne (JDK 1.4) pour obtenir chaque valeur de champ. Maintenant, le problème est que je devrais obtenir une chaîne vide après DEF.Cependant, je ne reçois pas l'espace vide entre DEF et FGHT.

Mon résultat devrait être - ABC, DEF, "", FGHT mais je reçois ABC, DEF, FGHT

21
ASD

De la documentation StringTokenizer:

StringTokenizer est une classe héritée qui est conservé pour des raisons de compatibilité bien que son utilisation soit découragée dans new code. Il est recommandé à quiconque recherchant cette fonctionnalité, utilisez le méthode split de String ou le Java.util.regex à la place.

Le code suivant devrait fonctionner: 

String s = "ABC|DEF||FGHT";
String[] r = s.split("\\|");
59
Desintegr

Utilisez l'indicateur returnDelims et vérifiez les deux occurrences suivantes du délimiteur:

String str = "ABC|DEF||FGHT";
String delim = "|";
StringTokenizer tok = new StringTokenizer(str, delim, true);

boolean expectDelim = false;
while (tok.hasMoreTokens()) {
    String token = tok.nextToken();
    if (delim.equals(token)) {
        if (expectDelim) {
            expectDelim = false;
            continue;
        } else {
            // unexpected delim means empty token
            token = null;
        }
    }

    System.out.println(token);
    expectDelim = true;
}

cela imprime

ABC
DEF
null
FGHT

L’API n’est pas jolie et est donc considérée comme un héritage (c’est-à-dire "presque obsolète"). Utilisez-le uniquement lorsque la correspondance des modèles est trop coûteuse (ce qui ne devrait être le cas que pour des chaînes extrêmement longues) ou lorsqu'une API attend une énumération.

Si vous passez à String.split(String), assurez-vous de citer le délimiteur. Soit manuellement ("\\|"), soit automatiquement à l'aide de string.split(Pattern.quote(delim));

14
sfussenegger

StringTokenizer ignore les éléments vides. Pensez à utiliser String.split, également disponible en 1.4.

Des javadocs:

StringTokenizer est une classe héritée qui est conservé pour des raisons de compatibilité bien que son utilisation soit découragée dans new code. Il est recommandé à quiconque recherchant cette fonctionnalité, utilisez le méthode split de String ou le Java.util.regex à la place.

9
Ryan Emerle

Voici un autre moyen de résoudre ce problème 

   String str =  "ABC|DEF||FGHT";
   StringTokenizer s = new StringTokenizer(str,"|",true);
   String currentToken="",previousToken="";


   while(s.hasMoreTokens())
   {
    //Get the current token from the tokenize strings
     currentToken = s.nextToken();

    //Check for the empty token in between ||
     if(currentToken.equals("|") && previousToken.equals("|"))
     {
        //We denote the empty token so we print null on the screen
        System.out.println("null");
     }

     else
     {
        //We only print the tokens except delimiters
        if(!currentToken.equals("|"))
        System.out.println(currentToken);
     }

     previousToken = currentToken;
   }

vous pouvez utiliser le constructeur qui prend un booléen 'returnDelims' supplémentaire et le passe fidèle à celui-ci . De cette façon, vous recevrez les délimiteurs, ce qui vous permettra de détecter cette condition.

sinon, vous pouvez simplement mettre en œuvre votre propre tokenizer de chaîne qui fait ce dont vous avez besoin, ce n'est pas si difficile.

2
Omry Yadan

C'est simple comme ça ...

    import Java.util.StringTokenizer;

    class stringtoken{
        public static void main (String args[]){

            String s1 = "StringTokenizer|by|Himal";

            StringTokenizer stt = new StringTokenizer(s1,"|");

            while (stt.hasMoreTokens()){
                String token = stt.nextToken();
                System.out.println(token);
            }
        }
    }

Résultat:

    StringTokenizer
    by
    Himal
1
MacKa

Voici un moyen de diviser une chaîne en jetons (un jeton est une ou plusieurs lettres)

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String s = scan.nextLine();
    s = s.replaceAll("[^A-Za-z]", " ");
    StringTokenizer arr = new StringTokenizer(s, " ");
    int n = arr.countTokens();
    System.out.println(n);
    while(arr.hasMoreTokens()){
        System.out.println(arr.nextToken());
    }
    scan.close();
}
0
Justin Gorny
package com.Java.String;

import Java.util.StringTokenizer;

public class StringWordReverse {

    public static void main(String[] kam) {
        String s;
        String sReversed = "";
        System.out.println("Enter a string to reverse");
        s = "THIS IS ASHIK SKLAB";
        StringTokenizer st = new StringTokenizer(s);


        while (st.hasMoreTokens()) {
            sReversed = st.nextToken() + " " + sReversed;
        }

        System.out.println("Original string is : " + s);
        System.out.println("Reversed string is : " + sReversed);

    }
}

Sortie:

Entrez une chaîne à inverser

La chaîne d'origine est: THIS IS ASHIK SKLAB

La chaîne inversée est: SKLAB ASHIK IS THIS 

0
Ashik ali