Split sur une chaîne vide renvoie un tableau de taille 1:
scala> "".split(',')
res1: Array[String] = Array("")
Considérez que cela renvoie un tableau vide:
scala> ",,,,".split(',')
res2: Array[String] = Array()
S'il vous plaît, expliquez :)
Réponses:
Pour la même raison que
et
renverra un tableau de taille 2. Tout ce qui se trouve avant la première correspondance est renvoyé comme premier élément.
la source
"".split("wtf").length
renvoie 0. Seulement dans JS c'est 1.: /"," split ","
renvoie un tableau de 0?Si vous divisez une orange zéro fois, vous avez exactement un morceau - l'orange.
la source
"orange".split(',')
, mais n'est évidemment pas pertinente pour le fractionnement de chaînes vides. Si je divise mon manque d'orange zéro fois, je n'ai toujours pas d'orange; représentons-nous cela comme une liste vide de non-oranges, une liste d'exactement un non-orange, une liste de douze sans-oranges, ou quoi? Ce n'est pas une question de savoir avec quoi nous aboutissons, mais comment nous le représentons.Les méthodes de fractionnement Java et Scala fonctionnent en deux étapes comme ceci:
",,,".split(",")
renvoie un tableau vide.Selon cela, le résultat de
"".split(",")
devrait être un tableau vide à cause de la deuxième étape, non?Cela devrait. Malheureusement, il s'agit d'un boîtier d'angle introduit artificiellement. Et c'est mauvais, mais au moins c'est documenté dans
java.util.regex.Pattern
, si vous vous souvenez de jeter un œil à la documentation:Solution 1: passez toujours -1 comme deuxième paramètre
Donc, je vous conseille de toujours passer
n == -1
comme deuxième paramètre (cela sautera l'étape deux ci-dessus), à moins que vous ne sachiez spécifiquement ce que vous voulez réaliser / vous êtes sûr que la chaîne vide n'est pas quelque chose que votre programme obtiendrait en entrée.Solution 2: utilisez la classe Guava Splitter
Si vous utilisez déjà Guava dans votre projet, vous pouvez essayer la classe Splitter (documentation) . Il possède une API très riche et rend votre code très facile à comprendre.
la source
"".split (",", n)
génère un tableau à un élément pour n dans (-1, 0, 1) avec Oracle JDK 8. Ce serait bien d'obtenir une liste de jetons non vides uniquement - supposons qu'une regex complète peut être nécessaire (quelque chose comme"[^,\\s]+[^,]*[^,\\s]*"
).Le fractionnement d'une chaîne vide renvoie la chaîne vide comme premier élément. Si aucun délimiteur n'est trouvé dans la chaîne cible, vous obtiendrez un tableau de taille 1 qui contient la chaîne d'origine, même si elle est vide.
la source
",".split(",")
renvoie un tableau vide."a".split(",")
->"a"
donc"".split(",")
->""
la source
",".split(",")
renvoie un tableau vide.Dans tous les langages de programmation, je sais qu'une chaîne vide est toujours une chaîne valide. Donc, faire un fractionnement en utilisant n'importe quel délimiteur retournera toujours un tableau d'élément unique où cet élément est la chaîne vide. S'il s'agissait d'une chaîne nulle (et non vide), ce serait un problème différent.
la source
Ce
split
comportement est hérité de Java, pour le meilleur ou pour le pire ...Scala ne remplace pas la définition de la
String
primitive.Notez que vous pouvez utiliser l'
limit
argument pour modifier le comportement :c'est-à-dire que vous pouvez définir le
limit=-1
pour obtenir le comportement de (tous?) autres langages:Il semble bien connu que le comportement de Java est assez déroutant mais:
Remarque: La méthode split n'était pas en Java depuis le début (ce n'est pas en 1.0.2 ) mais est en fait là depuis au moins 1.4 (par exemple voir JSR51 vers 2002). J'enquête toujours ...
Ce qui n'est pas clair, c'est pourquoi Java a choisi cela en premier lieu (je soupçonne que c'était à l'origine un oubli / bogue dans un "cas de pointe"), mais maintenant irrévocablement intégré dans le langage et il le reste .
la source
"".split(",")
renvoie toujours un tableau d'élément unique comme[""]
.Les chaînes vides n'ont pas de statut spécial lors de la division d'une chaîne. Vous pouvez utiliser:
la source