84 votes

Java : String split() : Je veux qu'il inclue les chaînes vides à la fin

J'ai la chaîne suivante :

String str = "\nHERE\n\nTHERE\n\nEVERYWHERE\n\n";

Si vous l'imprimez simplement, vous obtiendrez le résultat suivant (bien entendu, le symbole \n ne serait pas "littéralement" imprimée) :

\n
HERE\n
\n
THERE\n
\n
EVERYWHERE\n
\n
\n

Lorsque j'appelle la méthode split("\n") Je veux récupérer toutes les chaînes de caractères entre la nouvelle ligne ( \n ) et même des chaînes vides à la fin.

Par exemple, si je fais ceci aujourd'hui :

String strArray[] = str.split("\n");

System.out.println("strArray.length - " + strArray.length);
for(int i = 0; i < strArray.length; i++)
    System.out.println("strArray[" + i + "] - \"" + strArray[i] + "\"");

Je veux qu'il s'imprime comme suit (sortie A) :

strArray.length - 8
strArray[0] - ""
strArray[1] - "HERE"
strArray[2] - ""
strArray[3] - "THERE"
strArray[4] - ""
strArray[5] - "EVERYWHERE"
strArray[6] - ""
strArray[7] - ""

Actuellement, il s'imprime comme ceci (sortie B), et les chaînes vides finales sont ignorées :

strArray.length - 6
strArray[0] - ""
strArray[1] - "HERE"
strArray[2] - ""
strArray[3] - "THERE"
strArray[4] - ""
strArray[5] - "EVERYWHERE"

Comment faire pour que le split() inclut les chaînes vides comme dans la sortie A ? Je pourrais bien sûr écrire un morceau de code de plusieurs lignes, mais je voulais savoir, avant de perdre mon temps à essayer de le mettre en œuvre, s'il y avait une méthode simple ou deux lignes de code supplémentaires pour m'aider. Je vous remercie.

171voto

hobbs Points 71946

Utiliser str.split("\n", -1) (avec une mention négative limit argument). Lorsque split se voit attribuer zéro ou aucun limit il écarte les champs vides à la fin, et lorsqu'on lui donne un argument positif, il écarte les champs vides à la fin. limit limite le nombre de champs à ce nombre, mais un argument de type négatif limiter signifie autoriser un nombre quelconque de champs et ne pas rejeter les champs vides à la fin. Ceci est documenté aquí et le comportement est tiré de Perl.

7voto

Ian Roberts Points 59836

La méthode de division à un seul argument est spécifiée pour ignorer les divisions de chaînes vides à la fin, mais la version qui prend un argument "limite" les préserve, de sorte qu'une option consisterait à utiliser cette version avec une limite élevée.

String strArray[] = str.split("\n", Integer.MAX_VALUE);

3voto

Mark Peters Points 42201

Personnellement, j'aime l'utilitaire Guava pour le fractionnement :

System.out.println(Iterables.toString(
   Splitter.on('\n').split(input)));

Si vous souhaitez ensuite configurer le comportement des chaînes vides, vous pouvez le faire :

System.out.println(Iterables.toString(
   Splitter.on('\n').omitEmptyStrings().split(input)));

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