3 votes

La fonction de fractionnement de la classe String renvoie des résultats aberrants

Voici 2 codes

System.out.println(",,,,,".split(",").length);

y

System.out.println(",,,,, ".split(",").length);

pour le premier code, le résultat imprimé est 0 et le deuxième résultat du code imprimé est 6.

Ma question est de savoir pourquoi la division n'est pas en mesure de reconnaître "," lorsque je n'ajoute pas d'espace supplémentaire à la fin, mais il est capable de le reconnaître lorsque j'ajoute un espace supplémentaire à la fin.

Veuillez noter que j'ai essayé avec des expressions rationnelles (regex) " \\s *, \\s " mais le résultat est le même.

2voto

Tim Biegeleisen Points 53335

Je n'ai pas de référence documentaire à ce sujet, mais empiriquement, ce que j'ai vu lors de mes tests de String#split est que s'il n'y a pas de correspondance de texte, les correspondances de largeur nulle ne sont pas non plus renvoyées dans le tableau. La procédure suivante renvoie donc un tableau vide :

",,,,,".split(",")

Cependant, si vous ajoutez un espace à la fin de la série de virgules et que vous effectuez ensuite la même division, il n'y a qu'un seul espace correspondant. Par conséquent, le tableau revient avec toutes les correspondances, y compris les correspondances de largeur nulle :

",,,,, ".split(",")

Mais comme il n'y a pas de contenu entre les virgules, j'interpréterais votre besoin réel comme une volonté de diviser chaque virgule individuelle en un résultat distinct. Si c'est le cas, vous pouvez le faire en utilisant des solutions de contournement, comme ceci :

String input = ",,,,,";
String[] parts = input.split("(?<=,)(?=,)");
for (String part : parts) {
    System.out.println(part);
}

Ces sorties :

,
,
,
,
,

Démonstration

1voto

Solo Points 1872

split() en Java supprime par défaut les chaînes vides à la fin du tableau de résultats. Pour conserver les chaînes vides, vous pouvez utiliser split(delimiter, limit) con limit à une valeur négative, comme ceci

System.out.println(",,,,," .split(",", -1).length);

0voto

Shivang Agarwal Points 1110

Voyons plus en détail les résultats intéressants de la répartition ci-dessous :

System.out.println(",,,,,,".split(",").length); // 0
System.out.println(",,,,,, ".split(",").length); // 7
System.out.println(",,, ,,,".split(",").length); // 4
System.out.println(" ,,,,,,".split(",").length); // 1

Je me demande si la raison pour laquelle cela se produit est due au fait que l'énoncé de la méthode de fractionnement est inférieur à celui de la documentation :

Bande vide à la fin résultant.

Docs : https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)

si vous ne voulez pas que la méthode de fractionnement supprime ces espaces, vous devez utiliser un autre fractionnement avec une limite :

public String[] split(String regex,int limit)

Docs : https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String,%20int)

Ejemplo:

System.out.println(",,,,,,".split(",",-1).length); // 7
System.out.println(",,,,,, ".split(",",-1).length); // 7
System.out.println(",,, ,,,".split(",",-1).length); // 7
System.out.println(" ,,,,,,".split(",",-1).length); // 7

0voto

Kartik Kaushik Points 419

Oubliant la documentation, j'ai regardé directement dans le code et j'ai trouvé le morceau de code suivant dans java.lang.String#split(java.lang.String, int) :-

while (resultSize > 0 && list.get(resultSize - 1).length() == 0) {
    resultSize--;
}

Cela prouve que il est conçu pour supprimer le dernier élément s'il est vide . Et continuez ainsi jusqu'à ce que le dernier élément ne soit pas de longueur nulle.

Cette fonction est utile, par exemple, si vous avez une chaîne de caractères a,b, il doit renvoyer a y b dans le tableau résultant et non le dernier caractère blanc '' après la dernière virgule.

Si vous le faites System.out.println(", ,,,".split(",").length); il renverra 2 car la boucle while ci-dessus continuera à diminuer le résultat du côté droit jusqu'à ce qu'elle trouve quelque chose dont la longueur n'est pas nulle.

La boucle while ci-dessus est entourée de if (limit == 0) . Donc, si vous voulez tout compter, utilisez une limite non nulle. Si vous ne voulez pas de limite, utilisez un nombre négatif comme -1.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X