Boş bir dizede bölme 1 boyutunda bir dizi döndürür:
scala> "".split(',')
res1: Array[String] = Array("")
Bunun boş dizi döndürdüğünü düşünün:
scala> ",,,,".split(',')
res2: Array[String] = Array()
Lütfen açıkla :)
Boş bir dizede bölme 1 boyutunda bir dizi döndürür:
scala> "".split(',')
res1: Array[String] = Array("")
Bunun boş dizi döndürdüğünü düşünün:
scala> ",,,,".split(',')
res2: Array[String] = Array()
Lütfen açıkla :)
Yanıtlar:
Aynı sebepten dolayı
",test" split ','
ve
",test," split ','
2 boyutunda bir dizi döndürür. İlk eşleşmeden önceki her şey ilk öğe olarak döndürülür.
"".split("wtf").length
0 döndürür. Yalnızca JS'de 1'dir.: /
"," split ","
0 dizisi döndürüyor?
Bir turuncuyu sıfır kez bölerseniz, tam olarak bir parçanız olur - turuncu.
"orange".split(',')
, ancak boş dizeleri bölmek için açıkça geçerli değildir. Portakal eksikliğimi sıfır kere bölersem, hala portakalım yok; bunu portakal içermeyen boş bir liste mi, tam olarak bir portakalsız listesi mi, on iki portakal içermeyen bir liste mi, yoksa ne? Neyle sonuçlanacağımız değil, onu nasıl temsil ettiğimiz sorusu.
Java ve Scala split yöntemleri aşağıdaki gibi iki adımda çalışır:
",,,".split(",")
Boş dizi döndürmesinin nedeni budur .Buna göre "".split(",")
ikinci adımdan dolayı sonucu boş bir dizi olmalı, değil mi?
Olması gerekiyor. Ne yazık ki, bu yapay olarak tanıtılan bir köşe davası. Ve bu kötü, ama en azından belgelenmiştir içinde java.util.regex.Pattern
size belgelerine bakmak için hatırlamıyorsam,:
N == 0 için sonuç n <0 için olduğu gibidir, ancak sondaki boş dizeler döndürülmez. (Girişin kendisinin boş bir dize olduğu durumun yukarıda açıklandığı gibi özel olduğunu ve sınır parametresinin burada geçerli olmadığını unutmayın.)
Bu yüzden, n == -1
neyi başarmak istediğinizi özellikle bilmiyorsanız / boş dizenin programınızın girdi olarak alacağı bir şey olmadığından emin değilseniz, her zaman ikinci parametre olarak geçmenizi tavsiye ederim (bu yukarıdaki ikinci adımı atlayacaktır).
Halihazırda projenizde Guava kullanıyorsanız, Splitter (dokümantasyon) sınıfını deneyebilirsiniz . Çok zengin bir API'ye sahiptir ve kodunuzun anlaşılmasını çok kolaylaştırır.
Splitter.on(".").split(".a.b.c.") // "", "a", "b", "c", ""
Splitter.on(",").omitEmptyStrings().split("a,,b,,c") // "a", "b", "c"
Splitter.on(CharMatcher.anyOf(",.")).split("a,b.c") // "a", "b", "c"
Splitter.onPattern("=>?").split("a=b=>c") // "a", "b", "c"
Splitter.on(",").limit(2).split("a,b,c") // "a", "b,c"
"".split (",", n)
Oracle JDK 8 ile n (-1, 0, 1) için tek elemanlı bir dizi oluşturur. Yalnızca boş olmayan belirteçlerin bir listesini almak iyi olur - tam bir düzenli ifade gerekli olabilir (buna benzer bir şey "[^,\\s]+[^,]*[^,\\s]*"
).
Boş bir dizeyi bölmek, boş dizeyi ilk öğe olarak döndürür. Hedef dizede sınırlayıcı bulunmazsa, boş olsa bile orijinal dizeyi tutan 1 boyutunda bir dizi alırsınız.
",".split(",")
boş dizi döndürür.
Tüm programlama dillerinde boş bir dizenin hala geçerli bir Dize olduğunu biliyorum. Dolayısıyla, herhangi bir sınırlayıcı kullanarak bir bölme yapmak, her zaman bu öğenin boş Dize olduğu tek bir öğe dizisi döndürür. Boş (boş olmayan) bir Dize olsaydı, bu farklı bir sorun olurdu.
Bu split
davranış, iyi ya da kötü için Java'dan miras alınır ...
Scala, String
ilkelden gelen tanımı geçersiz kılmaz .
Davranışı değiştirmek için bağımsız değişkeni kullanabileceğinizilimit
unutmayın :
Limit parametresi, modelin uygulanma sayısını kontrol eder ve bu nedenle sonuçtaki dizinin uzunluğunu etkiler. Sınır n sıfırdan büyükse, model en fazla n - 1 kez uygulanacak, dizinin uzunluğu n'den büyük olmayacak ve dizinin son girişi, son eşleşen sınırlayıcının ötesindeki tüm girdileri içerecektir. Eğer n pozitif değilse, desen mümkün olduğu kadar çok uygulanır ve dizi herhangi bir uzunluğa sahip olabilir. N sıfırsa, desen mümkün olduğu kadar çok uygulanacaktır, dizi herhangi bir uzunluğa sahip olabilir ve sondaki boş dizeler atılacaktır.
yani, limit=-1
diğer dillerin (tümü?) davranışını elde etmek için ayarlayabilirsiniz :
@ ",a,,b,,".split(",")
res1: Array[String] = Array("", "a", "", "b")
@ ",a,,b,,".split(",", -1) // limit=-1
res2: Array[String] = Array("", "a", "", "b", "", "")
Java davranışının oldukça kafa karıştırıcı olduğu iyi biliniyor gibi görünüyor, ancak:
Yukarıdaki davranış, en az Java 5'ten Java 8'e kadar gözlemlenebilir.
JDK-6559590'da boş bir dizge bölünürken boş bir dizi döndürme davranışı değiştirilmeye çalışıldı . Ancak, çeşitli yerlerde gerilemeye neden olduğu zaman JDK-8028321'de kısa süre sonra geri alındı . Değişiklik onu asla ilk Java 8 sürümünde yapmaz.
Not: Bölme yöntemi başlangıçta Java'da değildi ( 1.0.2'de değil ) ama aslında en az 1.4'ten itibaren var (örneğin bkz. JSR51 yaklaşık 2002). Hala araştırıyorum ...
Belirsiz olan şey, Java'nın ilk etapta neden bunu seçtiğidir (benim şüphem, bunun başlangıçta bir "uç durumda" bir hata / hata olduğu yönündedir), ancak şimdi geri dönülmez bir şekilde dile pişirilmiştir ve öyle kalmıştır .
"".split(",")
yine de gibi tek bir öğe dizisi döndürüyor [""]
.
Bir dizeyi bölerken boş dizenin özel bir durumu yoktur. Kullanabilirsin:
Some(str)
.filter(_ != "")
.map(_.split(","))
.getOrElse(Array())