Java Ssortingng split a supprimé les valeurs vides

J’essaie de diviser la valeur en utilisant un séparateur. Mais je trouve les résultats surprenants

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

Je m’attends à obtenir 8 valeurs. [5,6,7, VIDE, 8,9, VIDE, VIDE] Mais je ne reçois que 6 valeurs.

Toute idée et comment réparer. Peu importe la valeur EMPTY, elle doit être dans un tableau.

split(delimiter) supprime par défaut les chaînes vides du tableau de résultats. Pour désactiver ce mécanisme, nous devons utiliser une version surchargée de split(delimiter, limit) avec une limit définie sur une valeur négative telle que

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

Petit plus de détails:
split(regex) renvoie en interne le résultat de split(regex, 0) et dans la documentation de cette méthode, vous pouvez trouver (emphase le mien)

Le paramètre limit contrôle le nombre de fois où le motif est appliqué et affecte donc la longueur du tableau résultant.

Si la limite n est supérieure à zéro, alors le motif sera appliqué au maximum n – 1 fois, la longueur du tableau ne sera pas supérieure à n et la dernière entrée du tableau contiendra toutes les entrées au-delà du dernier délimiteur correspondant.

Si n est non positif, le motif sera appliqué autant de fois que possible et le tableau pourra avoir n’importe quelle longueur.

Si n est égal à zéro, le modèle sera appliqué autant de fois que possible, le tableau peut avoir n’importe quelle longueur et les chaînes vides à la fin seront supprimées .

Exception :

Il convient de mentionner que la suppression de la chaîne vide de fin n’a de sens que si ces chaînes vides ont été créées par un mécanisme de division . Donc pour "".split(anything) puisque nous ne pouvons pas séparer "" nous obtiendrons comme résultat le tableau [""] .
Cela se produit parce que le fractionnement ne s’est pas produit ici, alors "" malgré le fait qu’il soit vide et que le suivi représente la chaîne d’ origine , pas la chaîne vide créée par le processus de division.

De la documentation de Ssortingng.split(Ssortingng regex) :

Cette méthode fonctionne comme si en invoquant la méthode split à deux arguments avec l’expression donnée et un argument limite de zéro. Les chaînes vides à la fin ne sont donc pas incluses dans le tableau résultant.

Vous devrez donc utiliser la version à deux arguments Ssortingng.split(Ssortingng regex, int limit) avec une valeur négative:

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

Doc:

Si la limite n est supérieure à zéro, alors le motif sera appliqué au maximum n – 1 fois, la longueur du tableau ne sera pas supérieure à n et la dernière entrée du tableau contiendra toutes les entrées au-delà du dernier délimiteur correspondant. Si n est non positif, le motif sera appliqué autant de fois que possible et le tableau pourra avoir n’importe quelle longueur. Si n est égal à zéro, le modèle sera appliqué autant de fois que possible, le tableau peut avoir n’importe quelle longueur et les chaînes vides à la fin seront supprimées.

Cela ne laissera aucun élément vide, y compris les éléments de fin.

A partir de l’ API Ssortingng.split () :

Divise cette chaîne autour des correspondances de l’expression régulière donnée. Cette méthode fonctionne comme si en invoquant la méthode split à deux arguments avec l’expression donnée et un argument limite de zéro. Les chaînes vides à la fin ne sont donc pas incluses dans le tableau résultant.

Ssortingng.split (regex, int) surchargé convient mieux à votre cas.

Une autre option est d’utiliser Splitter Guava. Il ne comporte pas la surcharge d’une expression régulière (dont vous n’avez pas besoin dans ce cas) et ne supprime pas par défaut les chaînes de fin vides.

Par exemple:

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

Pour plus d’informations, voir wiki: https://github.com/google/guava/wiki/SsortingngsExplained

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

Ce n’est pas l’exigence réelle dans tous les temps. L’inconvénient de ci-dessus est montré ci-dessous:

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

Lorsque des données sont manquantes:

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

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

L’exigence réelle est que la longueur devrait être de 7 bien qu’il manque des données. Parce qu’il y a des cas comme lorsque j’ai besoin d’insérer dans la firebase database ou autre chose. Nous pouvons y parvenir en utilisant l’approche ci-dessous.

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

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

Ce que j’ai fait ici, c’est de supprimer “|” tuyau à la fin, puis diviser la chaîne. Si vous avez “,” en tant que séparateur, vous devez append “, $” à l’intérieur de replaceAll.