chaîne tokenizer en Java

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

ABC|DEF| / FGHT

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

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

21
demandé sur bmargulies 2010-03-01 16:57:42

9 réponses

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 les nouvelles code. Il est recommandé à toute personne la recherche de cette fonctionnalité, utilisez le méthode split de chaîne ou le Java.util.paquet regex à la place.

Le code suivant devrait fonctionner :

String s = "ABC|DEF||FGHT";
String[] r = s.split("\\|");
59
répondu Desintegr 2010-03-01 14:04:45

Utilisez l'indicateur returnDelims et vérifiez 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 donc considérée comme héritée (c'est-à-dire "presque obsolète"). Utilisez-le uniquement lorsque la correspondance de motif 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 en utilisant string.split(Pattern.quote(delim));

14
répondu sfussenegger 2010-03-01 14:13:31

StringTokenizer ignore les éléments vides. Envisagez D'utiliser String.split, qui est également disponible en 1.4.

À partir 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 les nouvelles code. Il est recommandé à toute personne la recherche de cette fonctionnalité, utilisez le méthode split de chaîne ou le Java.util.paquet regex à la place.

9
répondu Ryan Emerle 2010-03-01 14:07:28

Vous pouvez utiliser le constructeur qui prend un booléen supplémentaire 'returnDelims', et lui passer true. cela vous permettra de recevoir les délimiteurs, ce qui vous permettra de détecter cette condition.

Alternativement, vous pouvez simplement implémenter votre propre chaîne tokenizer qui fait ce dont vous avez besoin, ce n'est pas si difficile.

2
répondu Omry Yadan 2010-03-01 14:03:21

Voici une autre façon 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;
   }
2
répondu Hariharan Sathya Narayanan 2015-03-29 05:50:48

Paquet com.Java.Chaîne;

Importer java.util.StringTokenizer;

Classe publique 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 pour inverser

La chaîne D'origine est: C'est ASHIK SKLAB

La chaîne inversée est: SKLAB ASHIK est-ce

1
répondu Ashik ali 2013-11-21 12:15:59

C'est aussi simple que ç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
répondu MacKa 2018-05-01 06:31:09

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
répondu Justin Gorny 2018-06-20 19:19:25
import java.util.StringTokenizer;

public class Solution {

    public static void main(String[] args) {
        String s="He is a very very good boy, isn't he?";
        StringTokenizer st = new StringTokenizer(s, ("[_\\@!?.', ]"));
        while (st.hasMoreTokens()) {
            System.out.println(st.nextToken());
        }

    }
}
-2
répondu isurie 2018-10-05 16:33:13