2010-03-01 10 views
21

Tengo un archivo de texto que contiene datos separados por '|'. Necesito obtener cada campo (separado por '|') y procesarlo. El archivo de texto puede demostrar de la siguiente manera:tokenizer de cadenas en Java

ABC | DEF || FGHT

estoy usando tokenizer cadena (JDK 1.4) para obtener cada valor de campo. Ahora el problema es que debería obtener una cadena vacía después de DEF. Sin embargo, no obtengo el espacio vacío entre DEF & FGHT.

Mi resultado debería ser - ABC, DEF, "", FGHT pero yo estoy haciendo ABC, DEF, FGHT

Respuesta

56

De StringTokenizer documentación:

StringTokenizer es una clase de legado que se conserva por razones de compatibilidad aunque su uso no se recomienda en nuevo código. Se recomienda que cualquier persona que busque esta funcionalidad en utilice el método de división de String o el paquete java.util.regex.

El siguiente código debería funcionar:

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

puede utilizar el constructor que toma booleano un extra 'returnDelims', y pase fiel a eso de esta manera recibirá los delimitadores, que le permitirán detectar esta condición.

alternativamente puede implementar su propio tokenizador de cadenas que hace lo que necesita, no es tan difícil.

9

StringTokenizer ignora los elementos vacíos. Considere usar String.split, que también está disponible en 1.4.

De los javadocs:

StringTokenizer es una clase de legado que se conserva por razones de compatibilidad aunque su uso no se recomienda en nuevo código. Se recomienda que cualquier persona que busque esta funcionalidad en utilice el método de división de String o el paquete java.util.regex.

15

usar la bandera returnDelims y comprobar dos apariciones posteriores del delimitador:

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; 
} 

Esto imprime

ABC 
DEF 
null 
FGHT 

La API no es bastante y por lo tanto considerado legado (es decir, "casi en desuso "). Úselo solo cuando la coincidencia de patrones sea demasiado costosa (lo que solo debería ser el caso de cadenas extremadamente largas) o cuando una API espera una enumeración.

En caso de que cambie a String.split(String), asegúrese de citar el delimitador.Ya sea manualmente ("\\|") o automáticamente utilizando string.split(Pattern.quote(delim));

2

Es simple como esto ...

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); 
      } 
     } 
    } 

Resultado:

StringTokenizer 
    by 
    Himal 
+0

los datos de entrada separadas por '|' y la única StringTokenizer capturar espacios en blanco? – Azi

+0

no .. podemos usar cualquier delimitador. puede ser un espacio en blanco, un personaje, un conjunto de cadenas, cualquier cosa ... – MacKa

2

paquete com.java.String;

import java.util.StringTokenizer;

clase pública 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); 

} 

}

Salida:

Introduzca una cadena de revertir

cadena original es: ESTA ES ASHIK SKLAB

cadena Invertida es : SKLAB ASHIK ES ESTE

+0

nice code! +1 :) – ADJ

2

Aquí hay otra manera de resolver este problema

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; 
    } 
+0

Esta respuesta no agrega nada. Y para el caso, como dice la respuesta aceptada (publicada en 2010), se recomienda no usar 'StringTokenizer' para empezar. – Radiodef