2012-02-22 26 views
47

pasando 0 como argumento de límite impide cadenas finales vacías, pero ¿cómo se puede evitar cadenas vacías?Cómo evitar que java.lang.String.split() cree una cadena vacía principal?

por ejemplo

String[] test = "/Test/Stuff".split("/"); 

resultados en una matriz con "", "Test", "cosas".

Sí, sé que podría rodar mi propia Tokenizer ... pero los documentos de la API para StringTokenizer dicen

"StringTokenizer es una clase de legado que se conserva la compatibilidad razones aunque su uso no se recomienda en la nueva código. se recomienda que cualquier persona que quiera utilizar esta funcionalidad de la división"

Respuesta

42

Su mejor apuesta es probablemente sólo retirar de él cualquier delimitador líder:

String input = "/Test/Stuff"; 
String[] test = input.replaceFirst("^/", "").split("/"); 

Usted puede hacer que sea más genérico poniéndolo en un método:

public String[] mySplit(final String input, final String delim) 
{ 
    return input.replaceFirst("^" + delim, "").split(delim); 
} 

String[] test = mySplit("/Test/Stuff", "/"); 
0

se puede utilizar para este propósito StringTokenizer ...

String test1 = "/Test/Stuff"; 
     StringTokenizer st = new StringTokenizer(test1,"/"); 
     while(st.hasMoreTokens()) 
      System.out.println(st.nextToken()); 
+2

'StringTokenizer' está marcado como desaprobado en la API y probablemente no debería ser usado. –

+0

¡No está en desuso! http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html –

+0

@McMillen puede decir de qué versión está obsoleto. En realidad, no sé esto. –

5

No creo que haya una manera de hacerlo con el método split incorporado. Así que hay dos opciones:

1) hacer su propia división

2) iterar a través de la matriz después de llamar a dividir y eliminar los elementos vacíos

Si usted hace su propia división sólo se puede combinar estas dos opciones

public List<String> split(String inString) 
{ 
    List<String> outList = new ArrayList<>(); 
    String[]  test = inString.split("/"); 

    for(String s : test) 
    { 
     if(s != null && s.length() > 0) 
      outList.add(s); 
    } 

    return outList; 
} 

o usted podría comprobar si el delimitador de estar en la primera posición antes de llamar a dividir y pasar por alto el primer carácter si lo hace:

String delimiter  = "/"; 
String delimitedString = "/Test/Stuff"; 
String[] test; 

if(delimitedString.startsWith(delimiter)){ 
    //start at the 1st character not the 0th 
    test = delimitedString.substring(1).split(delimiter); 
} 
else 
    test = delimitedString.split(delimiter); 
0

creo que tendréis para eliminar manualmente la primera cadena vacía Una forma sencilla de hacerlo es esto:

String string, subString; 
    int index; 
    String[] test; 

    string = "/Test/Stuff"; 
    index = string.indexOf("/"); 
    subString = string.substring(index+1); 

    test = subString.split("/"); 

Esto excluirá la cadena vacía principal.

+0

Pero con este código, si una cadena de entrada _didn't_ no tiene un delimitador principal, se saltearía el primer componente. Por ejemplo, '" Test/Stuff "' arrojaría solo un elemento, "Cosas". –

+0

Buen punto. En ese caso, se debería hacer un control adicional. – CodeBlue

1

Creo que no hay una función incorporada para eliminar cadenas en blanco en Java. Puede eliminar una cadena de borrado en blanco, pero puede generar un error. Por segura que puede hacer esto escribiendo pequeña pieza de código de la siguiente manera:

List<String> list = new ArrayList<String>(); 

    for(String str : test) 
    { 
    if(str != null && str.length() > 0) 
    { 
     list.add(str); 
    } 
    } 

    test = stringList.toArray(new String[list.size()]); 
19

Apache Commons tiene un método de utilidad para exactamente esto: org.apache.commons.lang.StringUtils.split

StringUtils.split()

realidad en nuestra compañía ahora preferimos usar este método para dividir en todos nuestros proyectos.

+1

Parece que no admite expresiones regulares como la versión JDK. – Stephan

0

Así es como he solucionado este problema. Tomo la cadena, llamo a .toCharArray() para dividirla en una matriz de caracteres, y luego recorro esa matriz y la agrego a mi lista de cadenas (envolviendo cada carácter con String.valueOf). Imagino que hay una compensación de rendimiento, pero parece una solución legible. ¡Espero que esto ayude!

char[] stringChars = string.toCharArray(); 
List<String> stringList = new ArrayList<>(); 

for (char stringChar : stringChars) { 
     stringList.add(String.valueOf(stringChar)); 
} 
Cuestiones relacionadas