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