Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IndexOf方法在C#/Java中应该返回-1时返回0_C#_Java_String_Logic_Indexof - Fatal编程技术网

IndexOf方法在C#/Java中应该返回-1时返回0

IndexOf方法在C#/Java中应该返回-1时返回0,c#,java,string,logic,indexof,C#,Java,String,Logic,Indexof,我的一个朋友带着这种奇怪的行为来找我,我无法解释,任何有见识的观点都会很感激 Im运行VS2005(C#2.0),下面的代码显示了该行为 int rr = "test".IndexOf(""); Console.WriteLine(rr.ToString()); 上面的代码,打印“0”,清楚地显示它应该返回-1 在Java中也会发生这种情况,其中以下类显示了行为: public class Test{ public static void main(String[] args){ Sy

我的一个朋友带着这种奇怪的行为来找我,我无法解释,任何有见识的观点都会很感激

Im运行VS2005(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的Im是正确的。从位置0开始,您可以(很简单地)匹配长度为零的字符串。同样,“包含”。

引自C#:

如果值为,则返回值为 是0


您描述的行为完全符合预期(至少在C#中是这样)。

0是正确的。Javadocs指出,
indexOf
的工作原理如下:

返回的整数是最小的 值k,以便:

 this.startsWith(str, k)

任何以
开头的字符串都等于原始字符串(并且每个字符串都以
开头),因此
str=”“
的最小
k
始终为0。

它应该返回0。您正在查找第一个出现的空字符串,对吗?:)

这样想:当查找字符串时,IndexOf将从位置0开始,尝试匹配字符串,如果不匹配,则移动到位置1、2等。当使用空字符串调用它时,它将尝试将空字符串与从位置0开始、长度为0的字符串匹配。万岁,什么都不等于什么


旁注:当您使用Console.Write/WriteLine时,没有真正的理由使用
ToString
。该函数自动调用相关对象的
ToString
方法。(除非重载到字符串)

这不是规则的例外,而是如何定义
indexOf
startsWith
的自然结果

您正在声明
“test”。indexOf(“”
应返回
-1
。这本质上等同于
“test”.startsWith(“”
应该返回
false
。为什么会这样?尽管本文档中专门将此情况描述为返回
true
,但这不仅仅是一个武断的决定


您将如何决定“测试”。例如,使用(“te”)开始测试?最简单的方法是使用递归。由于两个字符串都以字符
't'
开头,因此可以调用
“est”.startsWith(“e”)
并返回结果。类似地,您将调用
“st”.startsWith(“”)并返回结果。但是您已经知道答案应该是
true
,这就是为什么每个字符串都以

开头只是为了好玩。它在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
>“测试”。索引('r'))
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:未找到子字符串

更有趣的php实际上做得更好

php -r "print strpos('test','');"
PHP Warning:  strpos(): Empty delimiter. in Command line code on line 1

在索引位置0,“test”不包含“nothing”,它有一个“t”。按照你的说法,投了+1的票。:)正如ring所说,在0的位置上,它并不代表“什么都没有”。不过还是要谢谢你!文档中似乎对此进行了解释。我将把这作为IndexOf如何工作的规则的一个例外;这和你解释的不一样。@jcgarciam不太一样。这样看,;它以什么方式不以(或包含)“”开头。让我看看不匹配的角色。没有一个,因此它是一个匹配。感谢您为C#指出它(因此它似乎是规则的一个例外)。在它的反面(JavaDoc),没有很好地解释这种行为是可以预期的。@jcgarciam:good point;我将更新答案,表明它与C#有关。抱歉,我无法理解您的推理。每个字符串都以“”开头。同样,每个集合都是空集的超集。等这是一个非常方便的约定。和的副本