Мой друг приехал ко мне с этим странным поведением, которое я не могу объяснить, любое представление понимания ценилось бы.
Я запускаю 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
Это не исключение из правил, а скорее естественное следствие того, как определены indexOf
и startsWith
.
Вы утверждаете, что "test".indexOf("")
должен возвращать -1
. Это по сути эквивалентно утверждению, что "test".startsWith("")
должен возвращать false
. Почему это так? Хотя этот случай специально рассматривается в документации как возвращающий true
, это не просто произвольное решение.
Как бы вы решили, например, "test".startsWith("te")
? Самый простой способ - использовать рекурсию. Поскольку обе строки начинаются с символа 't'
, вы вызываете "est".startsWith("e")
и возвращаете результат. Аналогично, вы вызовете "st".startsWith("")
и вернете результат. Но вы уже знаете, что ответ должен быть true
, поэтому каждая строка начинается с ""
.
0 верно. Документация Javadocs указывает, что indexOf
работает следующим образом:
Возвращаемое целое число - это наименьшее значение k такое, что:
this.startsWith (str, k) {{1} }
Любая строка, начинающаяся с ""
, равна исходной строке (и каждая строка начинается с ""
), поэтому наименьшее значение k
для str = ""
всегда 0.
Он должен возвращать 0. Вы ищете первое вхождение пустой строки, верно? :)
Просто для удовольствия. Это также работает так же в 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
Более увлекательный php на самом деле работает намного лучше!
php -r "print strpos('test','');"
PHP Warning: strpos(): Empty delimiter. in Command line code on line 1
0 правильно. Начните с нулевой позиции, и вы сможете (тривиально) сопоставить строку нулевой длины. Аналогично, "" содержит "".
Если значение равно Пусто , возвращаемое значение {{1 }} равно 0.
Поведение, которое вы описываете, полностью соответствует ожиданиям (по крайней мере, в C #).
Подумайте об этом так: IndexOf при поиске строки начнет с позиции 0, попытается сопоставить строку, если она не подходит, перейдет к позиции 1, 2 и т. Д. Когда вы ее вызовете с пустой строкой он пытается сопоставить пустую строку со строкой, начинающейся с позиции 0 и имеющей длину 0. И ура, ничто не равно ничему.
Примечание: нет реальной причины использовать ToString
, когда вы используете Console.Write / WriteLine. Функция автоматически вызывает метод ToString
рассматриваемого объекта. (Без перегрузки ToString)