Метод IndexOf возвращает 0, когда он должен был вернуть -1 в C # / Java - PullRequest
7 голосов
/ 02 апреля 2010

Мой друг пришел ко мне с этим странным поведением, которое я не могу объяснить, любая точка зрения была бы признательна.

Я работаю 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("")));
 }
}

Я использую Java 1.6.0_17

Ответы [ 8 ]

21 голосов
/ 02 апреля 2010

Цитата из C # документации :

Если значение равно Пусто , возвращаемое значение это 0.

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

10 голосов
/ 03 апреля 2010

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

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

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

10 голосов
/ 02 апреля 2010

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

6 голосов
/ 02 апреля 2010

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

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

 this.startsWith(str, k)

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

3 голосов
/ 02 апреля 2010

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

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

2 голосов
/ 02 апреля 2010

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

1 голос
/ 03 апреля 2010

Больше веселья php делает работу лучше!

php -r "print strpos('test','');"
PHP Warning:  strpos(): Empty delimiter. in Command line code on line 1
1 голос
/ 03 апреля 2010

Просто для удовольствия. Это также работает в Python

>>> "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
...