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
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("\\|");
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));
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.
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.
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;
}
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
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
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();
}
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());
}
}
}