2010-04-02 6 views
7

Мой друг пришел ко мне с этим странным поведением, которое я не могу объяснить, любое понимание было бы оценено.Метод IndexOf возвращает 0, когда он должен был возвращать -1 в C#/Java

Im работает VS 2005 (C# 2.0), следующий код показывает поведение

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

выше код, печать "0", которые ясно показывают, что должно быть возвращение -1

Это также случается в Java, где следующий класс показывают поведение:

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

Im бега Java 1.6.0_17

+0

Дубликат http://stackoverflow.com/questions/3872936/why-do-strings-start-with-a-in-java и http://stackoverflow.com/questions/145509/why- do-abcd-startswith-return-true –

ответ

10

Это не исключение из правила, а скорее естественное следствие того, как определены indexOf и .

Вы утверждаете, что "test".indexOf("") должен вернуть -1. Это по существу эквивалентно утверждению, что "test".startsWith("") должен вернуть false. Почему это?Хотя этот случай специально рассматривается в документации как возвращающийся true, это не просто произвольное решение.

Как вы можете выбрать "test".startsWith("te"), например? Самый простой способ - использовать рекурсию. Поскольку обе строки начинаются с символа 't', вы вызываете "est".startsWith("e") и возвращаете результат. Аналогично, вы вызовете "st".startsWith("") и вернете результат. Но вы уже знаете, что ответ должен быть true, поэтому каждая строка начинается с "".

+0

@jleedev большое объяснение спасибо – jcgarciam

10

0 правильно. Начните с позиции нуля, и вы можете может (тривиально) соответствовать строке нулевой длины. Аналогичным образом, "" содержит "".

+0

, что было бы хорошо, если бы это было моим примером, я пробовал: «Тест» .IndexOf (""); , который отличается тем, что вы объясните. – jcgarciam

+0

@jcgarciam не очень. Посмотрите на это с другой стороны; каким образом это ** не ** начинается с (или содержит) "". Покажите мне персонажа, который не соответствует. Нет ни одного, поэтому это матч. –

21

Цитата из C# documentation:

Если значение Empty, возвращаемое значение 0.

Поведение, которое вы описываете полностью, как и ожидалось (по крайней мере в C#).

+0

Спасибо, что указали это на C# (так что это исключение для правила). На его счетной части (JavaDoc) неясно объяснено, что это поведение будет ожидаться. – jcgarciam

+0

@jcgarciam: хорошая точка; Я обновлю ответ, указав, что он связан с C#. –

6

0 Правильно. В Javadocs отметить, что indexOf работает следующим образом:

Целое число возвращается наименьшее значение к таким образом, что:

this.startsWith(str, k) 

Любая строка, начиная с "" равна исходной строке (и каждая строка начинается с ""), поэтому самый маленький k для str = "" всегда равен 0.

+0

Извините, но я не могу понять ваши рассуждения об этом. – jcgarciam

+4

* Каждая строка * начинается с "" Аналогично, каждый отдельный набор является надмножеством пустого набора. Etc ... Это очень удобная конвенция. – glebm

+0

Спасибо за указание @glebm – jcgarciam

2

Он должен вернуть 0. Вы ищут первое вхождение пустой строки, не так ли? :)

3

Подумайте об этом так: IndexOf, когда ищет строку, начнется в позиции 0, попытайтесь совместить строку, если она не подходит, перейдите в положение 1, 2 и т. Д. Когда вы вызываете его пустой строкой, он пытается совместить пустую строку со строкой, начиная с позиции 0 с длиной 0. И ура, ничто не равно ничто.

Боковое примечание: нет реальной причины использовать ToString, когда вы используете Console.Write/WriteLine. Функция автоматически вызывает метод ToString объекта, о котором идет речь. (Если не перегрузка ToString)

+0

В позиции индекса 0 «тест» не содержит «ничего», он имеет «t». Проголосовал +1 за то, как вы выразились. :) –

+0

как сказал кольцо, в позиции 0 он не держит «ничего». Но все равно спасибо! Кажется, это объясняется в Документации. Я помещу это как исключение в правило, как работает IndexOf. – jcgarciam

1

Просто для удовольствия. Он также работает как и в питоне

>>> "test".startswith("") 
True 
>>> "test".index("") 
0 

Python бросает ValueError вместо -1, что приятно.

>>> "test".index('r') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: substring not found 
1

Больше удовольствия php на самом деле делает путь лучше!

php -r "print strpos('test','');" 
PHP Warning: strpos(): Empty delimiter. in Command line code on line 1 
Смежные вопросы