La división de cadenas de Java eliminó los valores vacíos

Resuelto RaceBase asked hace 11 años • 5 respuestas

Estoy intentando dividir el Valor usando un separador. Pero estoy encontrando resultados sorprendentes.

String data = "5|6|7||8|9||";
String[] split = data.split("\\|");
System.out.println(split.length);

Espero obtener 8 valores. [5,6,7,EMPTY,8,9,EMPTY,EMPTY] Pero solo obtengo 6 valores.

Alguna idea y como solucionarlo. No importa que el valor VACÍO aparezca en algún lugar, debe estar en una matriz.

RaceBase avatar Jan 30 '13 17:01 RaceBase
Aceptado

split(delimiter)de forma predeterminada, elimina las cadenas vacías finales de la matriz de resultados. Para desactivar este mecanismo necesitamos usar la versión sobrecargada de split(delimiter, limit)con limitun valor negativo como

String[] split = data.split("\\|", -1);

Pocos detalles más:
split(regex)devuelve internamente el resultado de split(regex, 0)y en la documentación de este método que puede encontrar (el énfasis es mío)

El limitparámetro controla la cantidad de veces que se aplica el patrón y, por lo tanto, afecta la longitud de la matriz resultante.

Si el límite nes mayor que cero, entonces el patrón se aplicará como máximo n - 1 veces, la longitud de la matriz no será mayor que n y la última entrada de la matriz contendrá todas las entradas más allá del último delimitador coincidente.

Si non es positivo , el patrón se aplicará tantas veces como sea posible y la matriz puede tener cualquier longitud.

Si nes cero , el patrón se aplicará tantas veces como sea posible, la matriz puede tener cualquier longitud y las cadenas vacías finales se descartarán .

Excepción :

Vale la pena mencionar que eliminar la cadena vacía final sólo tiene sentido si dichas cadenas vacías fueron creadas mediante el mecanismo de división . Entonces, "".split(anything)como no podemos dividir ""más, obtendremos una [""]matriz de resultados.
Sucede porque la división no ocurrió aquí, por lo que ""a pesar de estar vacía y al final representa la cadena original , no la cadena vacía que se creó mediante el proceso de división.

jlordo avatar Jan 30 '2013 10:01 jlordo

De la documentación de String.split(String regex):

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

Entonces tendrás que usar la versión de dos argumentos String.split(String regex, int limit)con un valor negativo:

String[] split = data.split("\\|",-1);

Doc:

Si el límite n es mayor que cero, entonces el patrón se aplicará como máximo n - 1 veces, la longitud de la matriz no será mayor que n y la última entrada de la matriz contendrá todas las entradas más allá del último delimitador coincidente. Si n no es 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 finales se descartarán.

Esto no dejará fuera ningún elemento vacío, incluidos los finales.

ppeterka avatar Jan 30 '2013 10:01 ppeterka