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

  • Hudson Music

    Hudson Music

    13 Mart 2007
  • TheDigiCraft

    TheDigiCraft

    25 NİSAN 2011
  • TSE

    TSE

    12 Kasım 2012