2009-04-24 26 views
14

estoy usando el siguiente código:¿Cómo se puede dividir una cadena que contiene solo delimitador?

String sample = "::"; 
String[] splitTime = sample.split(":"); 
// extra detail omitted 
System.out.println("Value 1 :"+splitTime[0]); 
System.out.println("Value 2 :"+splitTime[1]); 
System.out.println("Value 3 :"+splitTime[2]); 

estoy recibiendo ArrayIndexOutofBound excepción. ¿Cómo maneja String.split() los delimitadores consecutivos o finales/de apertura?

Ver también:

Respuesta

0

Utilice la función StringTokenizer en el que u pasar la cadena y el segundo argumento como delimitador

uso splittime.length función para encontrar la longitud

+0

Un consejo. StringTokenizer trataría los dos dos puntos como un delimitador. De todos modos, StringTokenizer es una clase heredada; los desarrolladores son alentados a usar split() en su lugar. –

+0

Acerca del uso de splitTime.length: en este ejemplo, la longitud siempre será cero. Todos los "tokens" deberían haber sido cadenas de longitud cero, y StringTokenizer nunca devuelve tokens vacíos. –

4

Desde el J2SE API manual:

Arrastrando cadenas vacías, por tanto, no están incluidos en la matriz resultante.

Por lo tanto, si pasa en "::" obtendrá una matriz vacía porque todos los delimitadores están detrás.

Si desea asegurarse de que usted consigue no más de tres entradas que se debe utilizar:

String[] splitTime = sample.split(":", 3); 

Con una entrada de "::" que de hecho le daría tres cadenas vacías en la matriz de salida .

Sin embargo, si la entrada solo tiene un ":" en él, solo obtendrá dos elementos en su conjunto.

+0

usando "::". Split (":") en realidad devuelve una matriz vacía y no una matriz de dos elementos. –

+0

de hecho, tienes razón, voy a editar en consecuencia. – Alnitak

0

debe verificar la longitud de la matriz splitTime.

24

Alnitak tiene razón en que las cadenas vacías finales se descartarán por defecto.

Si desea tener cadenas finales vacías, debe usar split(String, int) y pasar un número negativo como el parámetro limit.

El parámetro limit controla el número de veces que se aplica el patrón y por lo tanto afecta a la longitud de la matriz resultante. Si el límite de n es mayor que cero entonces el patrón se aplicarán a lo sumo n   -   1 veces, longitud de la matriz no será mayor que n, y la última entrada del array contendrá toda entrada más allá del último delimitador coincidente. Si n es no positivo, el patrón se aplicará tantas veces como sea posible y la matriz puede tener cualquier longitud.Si n es cero, entonces el patrón se aplicará tantas veces como sea posible, la matriz puede tener cualquier longitud, y las cadenas vacías posteriores serán descartadas.

Tenga en cuenta que split(aString) es un sinónimo de split(aString, 0):

Este método funciona como si invocando el método de dos split discusión con la expresión dada y un argumento límite de cero. Por lo tanto, las cadenas vacías no se incluyen en la matriz resultante.

Además, debe usar un bucle para obtener los valores de la matriz; esto evita un posible ArrayIndexOutOfBoundsException.

lo que el código debe ser corregido (suponiendo que desea las cadenas vacías al final):

String sample = "::"; 
String[] splitTime = sample.split(":", -1); 
for (int i = 0; i < splitTime.length; i++) { 
    System.out.println("Value " + i + " : \"" + splitTime[i] + "\""); 
} 

Salida:

 
Value 0 : "" 
Value 1 : "" 
Value 2 : "" 
+0

buen punto sobre el límite -ve, pero todavía requiere que los límites de la matriz se verifiquen en caso de que la entrada solo tenga un ":" en ella. – Alnitak

+0

Punto tomado. –

1

como no, tal vez?

int ndx = 0; 
StringTokenizer t = new StringTokenizer(": : ::::",":"); 
while (t.hasMoreElements()) 
{ 
    System.out.println(String.format("Value %d : %s", ++ndx,t.nextElement())); 
} 
+0

Eso devuelve dos tokens, cada uno con solo un espacio. Pero Raja preguntó específicamente sobre cadenas que contienen nada más que delimitadores –

+0

Un par de puntos más. 1. cuando utiliza un StringTokenizer siempre debe usar hasMoreTokens() y nextToken(), no hasMoreElements() y nextElement(). Esos solo están ahí para dar cuerpo a la interfaz de Enumeración. 2. No necesita usar String.format() como lo hizo; PrintStreams como System.out tienen sus propios métodos de formato(), más los métodos printf() para los tradicionalistas. :-) –

+0

Gracias Alan, Como ya habrás adivinado, Java no es mi idioma principal. Sin embargo, estoy tratando de ser más hábil con eso. Así que aprecio tus comentarios. –

Cuestiones relacionadas