7 Stimmen

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

Ein Freund von mir kam zu mir mit diesem seltsamen Verhalten, das ich nicht erklären kann, jede Einsicht Ansicht würde geschätzt werden.

Im läuft VS 2005 (C# 2.0), der folgende Code zeigen das Verhalten

int rr = "test".IndexOf("");
Console.WriteLine(rr.ToString());

der obige Code gibt "0" aus, was eindeutig zeigt, dass er -1 hätte zurückgeben müssen

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

public class Test{
 public static void main(String[] args){
   System.out.println("Result->"+("test".indexOf("")));
 }
}

Ich verwende Java 1.6.0_17

21voto

Fredrik Mörk Punkte 151006

Zitat aus dem C# Dokumentation :

Wenn der Wert Leere der Rückgabewert ist 0.

Das Verhalten, das Sie beschreiben, ist völlig wie erwartet (zumindest in C#).

11voto

Marc Gravell Punkte 970173

0 ist richtig. Beginnen Sie an der Position Null und Sie kann (trivialerweise) mit einer Zeichenkette der Länge Null übereinstimmen. Ebenso "" enthält "".

10voto

Josh Lee Punkte 159535

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

Du behauptest, dass "test".indexOf("") sollte zurückkehren -1 . Dies ist im Wesentlichen gleichbedeutend mit der Behauptung, dass "test".startsWith("") sollte zurückkehren false . Warum ist das so? Obwohl dieser Fall in der Dokumentation ausdrücklich als Rückgabe von true ist dies nicht nur eine willkürliche Entscheidung.

Wie würden Sie entscheiden "test".startsWith("te") zum Beispiel? Der einfachste Weg ist die Rekursion. Da beide Zeichenketten mit dem Zeichen 't' rufen Sie "est".startsWith("e") und geben das Ergebnis zurück. In ähnlicher Weise werden Sie "st".startsWith("") und geben das Ergebnis zurück. Aber Sie wissen bereits, dass die Antwort lauten sollte true Deshalb beginnt jede Zeichenkette mit "" .

6voto

Justin Ardini Punkte 9530

0 ist richtig. Die Javadocs weisen darauf hin, dass indexOf funktioniert folgendermaßen:

Die zurückgegebene ganze Zahl ist der kleinste Wert k, so dass:

 this.startsWith(str, k)

Jede Zeichenkette, die mit "" gleich der ursprünglichen Zeichenfolge ist (und jede Zeichenfolge beginnt mit "" ), so dass die kleinste k para str = "" ist immer 0.

3voto

Rubys Punkte 3147

Betrachten Sie es so: IndexOf beginnt bei der Suche nach einer Zeichenkette an Position 0, versucht, die Zeichenkette zu finden, und wenn sie nicht passt, geht er weiter zu Position 1, 2 usw. Wenn Sie ihn mit einer leeren Zeichenkette aufrufen, versucht er, die leere Zeichenkette mit der an Position 0 beginnenden Zeichenkette der Länge 0 abzugleichen. Und hurra, nichts ist gleich nichts.

Nebenbemerkung: Es gibt keinen wirklichen Grund für die Verwendung von ToString wenn Sie Console.Write/WriteLine verwenden. Die Funktion ruft automatisch die ToString Methode des betreffenden Objekts. (Es sei denn, ToString wird überladen)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X