manejo - metodo para eliminar espacios en blanco java
División de cadena Java eliminó valores vacíos (5)
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.
Por lo tanto, tendrá 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á a lo sumo n - 1 veces, la longitud de la matriz no será mayor que n, y la última entrada de la matriz contendrá toda la entrada 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 finales se descartarán.
Esto no dejará fuera ningún elemento vacío, incluidos los finales.
Estoy tratando de dividir el valor utilizando un separador. Pero estoy encontrando los resultados sorprendentes.
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 solo estoy obteniendo 6 valores.
Cualquier idea y como arreglarla. No importa que el valor VACÍO llegue a cualquier lugar, debe estar en una matriz.
Desde String.split () API Doc :
Divide esta cadena alrededor de coincidencias de la expresión regular dada. 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.
String.split sobrecargado (regex, int) es más apropiado para su caso.
Otra opción es usar Guava''s Splitter. No tiene la sobrecarga de una expresión regular (que no es necesaria en este caso) y, de forma predeterminada, no descarta cadenas finales vacías.
Por ejemplo:
String data = "5|6|7||8|9||";
Iterable<String> results = Splitter.on(''|'').split(data);
// convert to array
String[] asArray = Iterables.toArray(results, String.class);
Para obtener más información, consulte wiki: https://github.com/google/guava/wiki/StringsExplained
String[] split = data.split("//|",-1);
Este no es el requisito real en todo el tiempo. El inconveniente de lo anterior 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 que 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 utilizando 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, estoy eliminando "|" tubo al final y luego dividir la cadena. Si tiene "," como separador, entonces necesita agregar ", $" dentro de replaceAll.
split(delimiter)
de forma predeterminada elimina 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 documentation de este método que puede encontrar (énfasis mío)
El parámetro
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á toda la entrada 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 finales se descartarán .
Excepción
Vale la pena mencionar que la eliminación de la cadena vacía final solo tiene sentido si dichas cadenas vacías se crean mediante un mecanismo dividido . Así que para "".split(anything)
ya que no podemos dividir ""
más "".split(anything)
obtendremos como resultado [""]
matriz.
Ocurre porque la división no ocurrió aquí, así que ""
pesar de estar vacío y al final representa una cadena original , no una cadena vacía que se creó mediante el proceso de división.