SORU
28 Mart 2014, Cuma


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
15 Aralık 2014, PAZARTESİ


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;
            }

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Fullscreen

    Fullscreen

    23 Mart 2006
  • Jordie Jordan

    Jordie Jorda

    27 Ocak 2008
  • Ricardo Cerqueira

    Ricardo Cerq

    28 Mayıs 2008