Метод IndexOf возвращается 0, когда он должен, имел возврат-1 в C# / Java

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

Я запускаю 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

7
задан Josh Lee 6 October 2010 в 20:43
поделиться

8 ответов

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

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

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

10
ответ дан 6 December 2019 в 04:47
поделиться

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

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

  this.startsWith (str, k) {{1} } 

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

6
ответ дан 6 December 2019 в 04:47
поделиться

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

2
ответ дан 6 December 2019 в 04:47
поделиться

Просто для удовольствия. Это также работает так же в 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
1
ответ дан 6 December 2019 в 04:47
поделиться

Более увлекательный php на самом деле работает намного лучше!

php -r "print strpos('test','');"
PHP Warning:  strpos(): Empty delimiter. in Command line code on line 1
1
ответ дан 6 December 2019 в 04:47
поделиться

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

10
ответ дан 6 December 2019 в 04:47
поделиться

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

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

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

21
ответ дан 6 December 2019 в 04:47
поделиться

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

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

3
ответ дан 6 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: