Die Methode IndexOf gibt 0 zurück, wenn sie -1 in C # / Java zurückgegeben haben sollte

7

Ein Freund von mir kam mit diesem seltsamen Verhalten zu mir, das ich nicht erklären kann, jede Einsicht wäre willkommen.

Im Ausführen von VS 2005 (C # 2.0) zeigt der folgende Code das Verhalten

%Vor%

den obigen Code, drucken Sie "0", die deutlich zeigen, dass es -1 zurückgeben sollte

Dies geschieht auch in Java, wo die folgende Klasse das Verhalten zeigt:

%Vor%

Im Ausführen von Java 1.6.0_17

    
jcgarciam 02.04.2010, 19:12
quelle

8 Antworten

10

Dies ist keine Ausnahme von der Regel, sondern eine natürliche Folge davon, wie indexOf und startsWith definiert sind.

Sie behaupten, dass "test".indexOf("") -1 zurückgeben soll. Dies entspricht im Wesentlichen der Behauptung, dass "test".startsWith("") false zurückgeben soll. Warum ist das? Obwohl dieser Fall in der Dokumentation speziell als Rückgabe von true behandelt wird, ist dies nicht nur eine willkürliche Entscheidung.

Wie würden Sie zum Beispiel "test".startsWith("te") entscheiden? Der einfachste Weg ist die Rekursion. Da beide Strings mit dem Zeichen 't' beginnen, rufen Sie "est".startsWith("e") auf und geben das Ergebnis zurück. Analog rufen Sie "st".startsWith("") auf und geben das Ergebnis zurück. Aber Sie wissen bereits, dass die Antwort true sein sollte, deshalb beginnt jede Zeichenfolge mit "" .

    
Josh Lee 02.04.2010, 20:03
quelle
21

Zitat aus der C # Dokumentation :

  

Wenn der Wert Leer ist, wird der Rückgabewert zurückgegeben   ist 0.

Das von Ihnen beschriebene Verhalten ist vollständig wie erwartet (zumindest in C #).

    
Fredrik Mörk 02.04.2010 19:14
quelle
10

0 ist korrekt. Beginnen Sie bei Position Null, und Sie können (trivial) mit einer Zeichenfolge der Länge Null übereinstimmen. Ebenso enthält " " ".

    
Marc Gravell 02.04.2010 19:13
quelle
6

0 ist korrekt. Die Javadocs weisen darauf hin, dass indexOf wie folgt funktioniert:

  

Die zurückgegebene Ganzzahl ist die kleinste   Wert k so, dass:

%Vor%

Jede Zeichenfolge, die mit "" beginnt, ist gleich der ursprünglichen Zeichenfolge (und jede Zeichenfolge beginnt mit "" ), sodass die kleinste k für str = "" immer 0 ist.

    
Justin Ardini 02.04.2010 19:15
quelle
3

Stellen Sie sich das so vor: IndexOf beginnt bei der Suche nach einer Zeichenkette an der Position 0, versucht, die Zeichenkette zu finden, wenn sie nicht passt, gehen Sie weiter zu Position 1, 2 usw. Wenn Sie sie aufrufen Mit einer leeren Zeichenfolge versucht es, die leere Zeichenfolge mit der Zeichenfolge ab Position 0 mit der Länge 0 abzugleichen. Und hurra, nichts ist gleich Null.

Randnotiz: Es gibt keinen Grund, ToString zu verwenden, wenn Sie Console.Write / WriteLine verwenden. Die Funktion ruft automatisch die Methode ToString des betreffenden Objekts auf. (Es sei denn, ToString wird überladen)

    
Rubys 02.04.2010 19:18
quelle
2

Es sollte 0 zurückgeben. Sie suchen nach dem ersten Vorkommen einer leeren Zeichenfolge, richtig? :)

    
glebm 02.04.2010 19:15
quelle
1

Mehr Spaß php macht tatsächlich einen besseren Job!

%Vor%     
Jorge Vargas 03.04.2010 05:55
quelle
1

Nur zum Spaß. Es funktioniert auch so in Python

%Vor%

Python löst einen ValueError anstelle von -1 aus, was nett ist.

%Vor%     
Jorge Vargas 03.04.2010 01:38
quelle

Tags und Links