Java String split supprimé valeurs vides

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

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

Je m'attends à obtenir 8 valeurs. [5,6,7,VIDE,8,9,VIDE,VIDE] Mais je n'obtiens que 6 valeurs.

N'importe quelle idée et comment réparer. Peu importe la valeur vide vient à anyplace, il devrait être en tableau.

207
demandé sur Reddy 2013-01-30 14:43:11

5 réponses

split(delimiter) par défaut supprime les chaînes vides à la suite du tableau de résultats. Pour désactiver ce mécanisme, nous devons utiliser la version surchargée de split(delimiter, limit) avec limit réglé à la valeur négative comme

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

plus de détails:

split(regex) retours internes résultat de split(regex, 0) et dans documentation de cette méthode, vous pouvez trouver (emphasis mine)

le paramètre limit contrôle le nombre de fois que 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 apparié.

si n est non-positive alors le modèle sera appliqué autant de fois que possible et le tableau peut avoir n'importe quelle longueur.

si n est zéro alors le motif sera appliqué autant de fois que possible, le tableau peut avoir n'importe quelle longueur, et traînant des chaînes vides sera écarté .

Exception :

Il est intéressant de noter que la suppression de la corde vide arrière n'a de sens que si de telles cordes vides ont été créées par le mécanisme de division . Donc pour "".split(anything) puisque nous ne pouvons pas diviser "" plus loin nous obtiendrons comme résultat [""] tableau.

Cela se produit parce que la scission ne s'est pas produite ici, donc "" malgré le fait qu'elle soit vide et qu'elle représente chaîne originale chaîne, pas une chaîne vide qui a été créé par fractionnement.

362
répondu jlordo 2017-01-21 12:03:43

de la documentation de String.split(String regex) :

cette méthode fonctionne comme si elle invitait la méthode de dédoublement à deux arguments avec l'expression donnée et un argument limite de zéro. Les chaînes vides ne sont donc pas incluses dans le tableau résultant.

donc vous devrez utiliser la version à deux arguments String.split(String regex, int limit) avec un négatif valeur:

String[] 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 apparié. si n n'est pas positif, alors le modèle sera appliqué autant de fois que possible et le tableau peut avoir n'importe quelle longueur. Si n est zéro alors le modèle sera appliqué comme plusieurs fois que possible, le tableau peut avoir n'importe quelle longueur, et les chaînes de caractères vides seront écartées.

cela ne laissera aucun élément vide, y compris les éléments suivants.

31
répondu ppeterka 2013-01-30 10:54:03

À Partir De De La Chaîne.split () API Doc :

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 de split à deux arguments avec l'expression donnée et un argument limite de zéro. De fuite vide les chaînes ne sont donc pas incluses dans le tableau résultant.

surchargé Chaîne.split (regex, int) est plus approprié pour votre cas.

4
répondu PermGenError 2013-01-30 10:44:36

une autre option est d'utiliser le séparateur de goyave. Il n'a pas le au-dessus d'une expression régulière (dont vous n'avez pas besoin dans ce cas) et par défaut ne rejette pas les chaînes vides.

par exemple:

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

pour plus d'informations, voir wiki: https://github.com/google/guava/wiki/StringsExplained

3
répondu nickool 2016-11-28 23:46:26

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

ce n'est pas l'exigence réelle en tout temps. L'inconvénient de ce qui précède est montré ci-dessous:

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

lorsque les données sont manquantes:

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

besoin réel est la longueur devrait être de 7 bien qu'il y ait des données manquantes. Parce qu'il y a des cas comme quand j'ai besoin d'insérer dans la base de données ou autre chose. Nous pouvons y parvenir en utilisant l'approche ci-dessous.

    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

quoi J'ai fait ici est, je retire " / " pipe à la fin et puis la fente de la corde. Si vous avez "," comme séparateur ensuite, vous devez ajouter ",$" à l'intérieur de replaceAll.

0
répondu Yanish Pradhananga 2018-06-09 05:48:24