2012-09-12 24 views
5

tengo un problema aparentemente simple de dividir una coma separó String en tokens, con lo que la salida debe incluir tokens vacíos en los casos en que:Tokenising una cadena que contiene fichas vacías

  • El primer carácter en el String es una coma .
  • El último carácter en el String es una coma.
  • Se producen dos comas consecutivas.

Por ejemplo, para la String: ",abd,def,,ghi," debería producir la salida: {"", "abd", "def", "", "ghi", ""}.

He intentado usar String.split, Scanner y StringTokenizer para esto, pero cada uno proporciona una salida diferente no deseada (ejemplos a continuación). ¿Alguien puede sugerir una elegante solución para esto, preferentemente utilizando clases JDK? Obviamente, podría codificar algo yo mismo, pero siento que me falta algo en uno de los tres enfoques mencionados. Tenga en cuenta que el delimitador es un String fijo, aunque no necesariamente una coma, ni un solo carácter.

Código Ejemplo

import java.util.*; 

public class Main12 { 
    public static void main(String[] args) { 
    String s = ",abd,def,,ghi,"; 
    String[] tokens = s.split(","); 

    System.err.println("--- String.split Output ---"); 
    System.err.println(String.format("%s -> %s", s, Arrays.asList(tokens))); 

    for (int i=0; i<tokens.length; ++i) { 
     System.err.println(String.format("tokens[%d] = %s", i, tokens[i])); 
    } 

    System.err.println("--- Scanner Output ---"); 

    Scanner sc = new Scanner(s); 
    sc.useDelimiter(","); 
    while (sc.hasNext()) { 
     System.err.println(sc.next()); 
    } 

    System.err.println("--- StringTokenizer Output ---"); 

    StringTokenizer tok = new StringTokenizer(s, ","); 
    while (tok.hasMoreTokens()) { 
     System.err.println(tok.nextToken()); 
    } 
    } 
} 

salida

$ java Main12 
--- String.split Output --- 
,abd,def,,ghi, -> [, abd, def, , ghi] 
tokens[0] = 
tokens[1] = abd 
tokens[2] = def 
tokens[3] = 
tokens[4] = ghi 
--- Scanner Output --- 
abd 
def 

ghi 
--- StringTokenizer Output --- 
abd 
def 
ghi 

Respuesta

12

Pasar un -1 a split como el limit argumento:

String s = ",abd,def,,ghi,"; 
String[] tokens = s.split(",", -1); 

A continuación, su matriz de resultados incluirá las cadenas vacías finales.

Desde el javadocs:

Si [el límite] no es positivo, entonces el patrón se aplica como tantas veces como sea posible y la matriz puede tener cualquier longitud. Si [el límite] es cero, el patrón se aplicará tantas veces como sea posible, la matriz puede tener cualquier longitud, y las cadenas vacías posteriores se descartarán.

Calling split(regex) actúa como si el argumento es limit0, por lo que se arrastra cadenas vacías se descartan.

Cuestiones relacionadas