2017-10-17 1 views
9

Zu meinem Verständnis sollte das folgende Programm 0,0 als Ausgabe drucken. Wenn ich dieses Programm starte bekomme ich 1,0 als eine Ausgabe.Eigenartiges Verhalten von split() der String-Klasse

public class Test1 { 
    public static void main(String[] args) { 
     System.out.println("".split(";").length); //1 
     System.out.println(";".split(";").length);//0 
    } 
} 

Bitte helfen Sie mir zu verstehen, was hier vor sich geht?

+0

Hier ist die gleiche Frage mit Scala Stichwort: https://stackoverflow.com/questions/4964484/why-does-split-on-an -empty-string-return-a-non-empty-array Die Antwort von Rok Kralj spricht diese Inkonsistenz an: https://stackoverflow.com/questions/4964484/why-does-split-on-an-empty-string-return- a-nicht-leer-array # 37796531 –

+1

@ nullpointer - Bitte überprüfen Sie die Lang-Art, es ist für Scala !!!! Glaubst du, dass sowohl Scala als auch Java identisch sind ??? –

+1

@LoneWolf Macht es einen Unterschied? Haben Sie Probleme, dies auf Java anzuwenden? –

Antwort

5

relavant Code

 // If no match was found, return this 
     if (off == 0) 
      return new String[]{this}; 

     // Add remaining segment 
     if (!limited || list.size() < limit) 
      list.add(substring(off, value.length)); 
+0

Dies ist eigentlich die Antwort auf die Frage. – shinjw

+0

Ich würde in die Zeilen über 'if (off == 0)' für mehr Kontext fallen lassen. – shinjw

3

gefunden Sie einen kühlen Rand Fall: Wenn eine Zeichenfolge, die Sie durch eine Anordnung, dass String mit spaltete es nicht die Zeichen enthalten nur

zurückgegeben Wenn die Trennung Zeichen in der Zeichenfolge ist ein Array dann erhalten enthält alles geteilt, außer den leeren Strings.

Also im zweiten Fall sollte das Ergebnis ein Array mit zwei leeren Zeichenfolgen sein, aber die Split-Funktion entfernt sie. Im ersten Fall, da split tatsächlich nichts gespalten hat und nichts entfernt.

+0

'" ;;;; ". length gibt 0 und" ";;; 1; ".length" gibt 3. Der zweite Fall ist ein sehr verrücktes und unerwartetes Verhalten. – clemens

+0

Danke Benutzer .... :) für Begründung –

5

Im ersten Fall, weil es einfach keine Übereinstimmung gibt, wird die Zeichenfolge gemäß diesem Teil der Javadoc zurückgegeben werden:

Wenn der Ausdruck paßt nicht einen Teil des Eingangs dann das resultierende Array hat nur ein Element, nämlich diese Zeichenfolge.

Was Ihren zweiten Fall, in dem Fall, dass eine Spaltung stattfindet, werden die hinteren leeren Saiten entfernt:

Wenn n null ist, dann wird das Muster so oft angewandt werden Wie möglich, kann das Array eine beliebige Länge haben, und nachlaufende leere Zeichenfolgen werden verworfen.

(Hervorhebung von mir)

Quelle: Javadoc

Verwandte Themen