Das Teilen auf eine leere Zeichenfolge gibt ein Array der Größe 1 zurück:
scala> "".split(',')
res1: Array[String] = Array("")
Beachten Sie, dass dies ein leeres Array zurückgibt:
scala> ",,,,".split(',')
res2: Array[String] = Array()
Bitte erkläre :)
Antworten:
Aus dem gleichen Grund, dass
und
gibt ein Array der Größe 2 zurück. Alles vor der ersten Übereinstimmung wird als erstes Element zurückgegeben.
quelle
"".split("wtf").length
gibt 0 zurück. Nur in JS ist es 1 .: /"," split ","
ein Array von 0 zurückgegeben?Wenn Sie eine Orange nullmal teilen, haben Sie genau ein Stück - die Orange.
quelle
"orange".split(',')
, aber offensichtlich nicht relevant für das Teilen leerer Zeichenfolgen. Wenn ich meinen Mangel an Orange nullmal aufteile, habe ich immer noch keine Orange; Stellen wir das als leere Liste von No-Orangen, als Liste von genau einem No-Orange, als Liste von zwölf No-Orangen dar, oder was? Es geht nicht darum, was wir am Ende haben, sondern wie wir es darstellen.Die Java- und Scala-Split-Methoden arbeiten in zwei Schritten:
",,,".split(",")
leeres Array zurückgegeben.Demnach ist das Ergebnis von
"".split(",")
wegen des zweiten Schritts ein leeres Array sein, oder?Es sollte. Leider ist dies ein künstlich eingeführter Eckfall. Und das ist schlecht, aber zumindest ist dokumentiert in
java.util.regex.Pattern
, wenn Sie einen Blick in der Dokumentation nehmen erinnern:Lösung 1: Übergeben Sie immer -1 als zweiten Parameter
Deshalb rate ich Ihnen, immer zu bestehen
n == -1
als zweiten Parameter zu übergeben (dies überspringt Schritt 2 oben), es sei denn, Sie wissen genau, was Sie erreichen möchten / Sie sind sicher, dass die leere Zeichenfolge nicht etwas ist, das Ihr Programm als Eingabe erhalten würde.Lösung 2: Verwenden Sie die Guava Splitter-Klasse
Wenn Sie Guava bereits in Ihrem Projekt verwenden, können Sie die Splitter- Klasse (Dokumentation) ausprobieren . Es hat eine sehr umfangreiche API und macht Ihren Code sehr einfach zu verstehen.
quelle
"".split (",", n)
generiert mit Oracle JDK 8 ein Ein-Element-Array für n in (-1, 0, 1). Es wäre schön, nur eine Liste nicht leerer Token zu erhalten - möglicherweise ist eine vollständige Regex erforderlich (so etwas wie"[^,\\s]+[^,]*[^,\\s]*"
).Durch das Teilen einer leeren Zeichenfolge wird die leere Zeichenfolge als erstes Element zurückgegeben. Wenn in der Zielzeichenfolge kein Trennzeichen gefunden wird, erhalten Sie ein Array der Größe 1, das die ursprüngliche Zeichenfolge enthält, auch wenn diese leer ist.
quelle
",".split(",")
Gibt ein leeres Array zurück."a".split(",")
->"a"
deshalb"".split(",")
->""
quelle
",".split(",")
Gibt ein leeres Array zurück.In allen Programmiersprachen weiß ich, dass eine leere Zeichenfolge immer noch eine gültige Zeichenfolge ist. Wenn Sie also einen Split mit einem beliebigen Trennzeichen ausführen, wird immer ein einzelnes Elementarray zurückgegeben, wobei dieses Element die leere Zeichenfolge ist. Wenn es ein null (nicht leerer) String wäre, wäre das ein anderes Problem.
quelle
Dieses
split
Verhalten wird von Java geerbt, egal ob gut oder schlecht ...Scala überschreibt die Definition des
String
Grundelements nicht.Beachten Sie, dass Sie das
limit
Argument verwenden können, um das Verhalten zu ändern :dh Sie können festlegen
limit=-1
, dass das Verhalten (aller?) anderer Sprachen ermittelt wird:Es scheint bekannt zu sein, dass das Java-Verhalten ziemlich verwirrend ist, aber:
Hinweis: Die Split-Methode war von Anfang an nicht in Java ( nicht in 1.0.2 ), sondern tatsächlich ab mindestens 1.4 (siehe z. B. JSR51 um 2002). Ich untersuche immer noch ...
Was unklar ist, ist, warum Java dies überhaupt gewählt hat (mein Verdacht ist, dass es ursprünglich ein Versehen / Fehler in einem "Randfall" war), aber jetzt unwiderruflich in die Sprache eingebrannt und so bleibt es .
quelle
"".split(",")
dennoch ein einzelnes Elementarray wie zurück[""]
.Leere Zeichenfolgen haben beim Teilen einer Zeichenfolge keinen besonderen Status. Sie können verwenden:
quelle