Java String divide valores vacíos eliminados

Estoy tratando de dividir el valor usando un separador. Pero estoy encontrando los sorprendentes resultados

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

Estoy esperando obtener 8 valores. [5,6,7, VACÍO, 8,9, VACÍO, VACÍO] Pero obtengo solo 6 valores.

Alguna idea y como arreglarla No importa que el valor VACÍO llegue en cualquier lugar, debería estar en una matriz.

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

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

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

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

Si el límite n es mayor que cero, entonces el patrón se aplicará a lo sumo 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 , 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 .

Excepción :

Vale la pena mencionar que la eliminación de una cadena vacía final solo tiene sentido si dichas cadenas vacías son creadas por un mecanismo de división . Entonces para "".split(anything) ya que no podemos dividir "" más lejos obtendremos como resultado [""] array.
Sucede porque la división no ocurrió aquí, así que "" pesar de estar vacío y al final representa la cadena original , cadena no vacía que se creó al dividir el proceso.

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

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

Por lo tanto, deberá 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á a lo sumo 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, 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.

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

Desde el API API String.split () :

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

Overloaded String.split (regex, int) es más apropiado para su caso.

Otra opción es usar el divisor de guayaba. No tiene la sobrecarga de una expresión regular (que no necesita en este caso) y, por defecto, no descarta las cadenas finales vacías.

Por ejemplo:

  String data = "5|6|7||8|9||"; Iterable results = Splitter.on('|').split(data); // convert to array String[] asArray = Iterables.toArray(results, String.class); 

Para obtener más información, consulte el wiki: https://github.com/google/guava/wiki/StringsExplained

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

Este no es el requisito real en todo el tiempo. El drawback de arriba se muestra a continuación:

 Scenerio 1: When all data are present: String data = "5|6|7||8|9|10|"; String[] split = data.split("\\|"); String[] splt = data.split("\\|",-1); System.out.println(split.length); //output: 7 System.out.println(splt.length); //output: 8 

Cuando faltan datos:

 Scenerio 2: Data Missing String data = "5|6|7||8

“; String[] split = data.split(“\\|”); String[] splt = data.split(“\\|”,-1); System.out.println(split.length); //output: 5 System.out.println(splt.length); //output: 8

El requisito real es la longitud debe ser 7 aunque faltan datos. Porque hay casos como cuando necesito insertar en la base de datos o algo más. Podemos lograr esto usando el siguiente enfoque.

  String data = "5|6|7||8

“; String[] split = data.split(“\\|”); String[] splt = data.replaceAll(“\\|$”,””).split(“\\|”,-1); System.out.println(split.length); //output: 5 System.out.println(splt.length); //output:7

Lo que he hecho aquí es que eliminaré “|” pique al final y luego divida la Cadena. Si tiene “,” como un separador, entonces necesita agregar “, $” dentro de replaceAll.