Neden Java 8 bazen bölünmüş kaldırır sonucu dizinin başında boş dizeler?
Boş ayrıldığımızda Java 7 (ve önceki) dizesi gibi
String[] tokens = "abc".split("");
bölme mekanizması yerler |
ile işaretli bölünür
|a|b|c|
boş çünkü ""
ve her karakter öncesi ve sonrası var. Sonuç olarak ilk başta bu dizi yaratacaktı
["", "a", "b", "c", ""]
ve daha sonra firar boş dizeler açıkça limit
bağımsız değişken negatif değer sunuyoruz olmadı çünkü) kaldıracak sonunda dönecektir
["", "a", "b", "c"]
GÖRDÜM 8 bölünmüş şimdi mekanizması değişmiş gibi görünüyor. Kullandığımız zaman şimdi
"abc".split("")
başlangıçta boş dizeler de kaldırılır gibi görünüyor ["", "a", "b", "c"]
yerine ["a", "b", "c"]
dizi alacağız. Ama bu teori örneği, çünkü başarısız olur
"abc".split("a")
["", "bc"]
başlangıçta boş bir dize dizisi ile dönüyor.
Biri burada neler olduğunu ve bu durumlarda split kuralları Java 8'de nasıl değiştiğini açıklayabilir mi?
CEVAP
Java 7 ve Java 8 arası String.split
Pattern.split
çağırır) değişiklikleri davranış.
Belgeler
Aşağıdaki fıkra eklenmesini görüyoruz Java 7 Java 8 Pattern.split
belgeler arasında karşılaştırma:
Giriş sırasının başında olumlu genişlikte bir maç sonra lider olduğunda boş bir dize elde edilen dizinin başında bulunmaktadır. Başında sıfır genişlik bir maç ancak böyle boş önde gelen dize üretir.
Aynı fıkra da Java 8, Java 7 göre String.split
eklenir.
Referans uygulama
Bize Java 7 ve Java 8'de referans uygulanabilmesi Pattern.split
kod karşılaştıralım. Kod sürüm 7u40-b43 ve 8-b132 için grepcode alındı.
Java 7
public String[] split(CharSequence input, int limit) {
int index = 0;
boolean matchLimited = limit > 0;
ArrayList<String> matchList = new ArrayList<>();
Matcher m = matcher(input);
// Add segments before each match found
while(m.find()) {
if (!matchLimited || matchList.size() < limit - 1) {
String match = input.subSequence(index, m.start()).toString();
matchList.add(match);
index = m.end();
} else if (matchList.size() == limit - 1) { // last one
String match = input.subSequence(index,
input.length()).toString();
matchList.add(match);
index = m.end();
}
}
// If no match was found, return this
if (index == 0)
return new String[] {input.toString()};
// Add remaining segment
if (!matchLimited || matchList.size() < limit)
matchList.add(input.subSequence(index, input.length()).toString());
// Construct result
int resultSize = matchList.size();
if (limit == 0)
while (resultSize > 0 && matchList.get(resultSize-1).equals(""))
resultSize--;
String[] result = new String[resultSize];
return matchList.subList(0, resultSize).toArray(result);
}
Java 8
public String[] split(CharSequence input, int limit) {
int index = 0;
boolean matchLimited = limit > 0;
ArrayList<String> matchList = new ArrayList<>();
Matcher m = matcher(input);
// Add segments before each match found
while(m.find()) {
if (!matchLimited || matchList.size() < limit - 1) {
if (index == 0 && index == m.start() && m.start() == m.end()) {
// no empty leading substring included for zero-width match
// at the beginning of the input char sequence.
continue;
}
String match = input.subSequence(index, m.start()).toString();
matchList.add(match);
index = m.end();
} else if (matchList.size() == limit - 1) { // last one
String match = input.subSequence(index,
input.length()).toString();
matchList.add(match);
index = m.end();
}
}
// If no match was found, return this
if (index == 0)
return new String[] {input.toString()};
// Add remaining segment
if (!matchLimited || matchList.size() < limit)
matchList.add(input.subSequence(index, input.length()).toString());
// Construct result
int resultSize = matchList.size();
if (limit == 0)
while (resultSize > 0 && matchList.get(resultSize-1).equals(""))
resultSize--;
String[] result = new String[resultSize];
return matchList.subList(0, resultSize).toArray(result);
}
Java 8'de aşağıdaki kodu eklenmesi boyu sıfırın üstünde davranışını açıklar giriş dizesi, başında maç hariç.
if (index == 0 && index == m.start() && m.start() == m.end()) {
// no empty leading substring included for zero-width match
// at the beginning of the input char sequence.
continue;
}
Neden char[] şifreler için Dize Java t...
Neden belirli Unicode karakterler içer...
Neden Java geçici değişkenler var mı?...
Neden boşluk meta etrafında bazen gere...
Neden Java Vector sınıfı eski veya kul...