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

jcg*_*iam 7 c# java string logic indexof

我的一个朋友带着这种我无法解释的奇怪行为来找我,任何洞察力的观点都会受到赞赏.

我正在运行VS 2005(C#2.0),以下代码显示了该行为

int rr = "test".IndexOf("");
Console.WriteLine(rr.ToString());
Run Code Online (Sandbox Code Playgroud)

上面的代码,打印"0",清楚地表明它应该返回-1

这也发生在Java中,下面的Class显示了这种行为:

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

我正在运行Java 1.6.0_17

Fre*_*örk 21

引用C#文档:

如果value为Empty,则返回值为0.

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


Mar*_*ell 10

0是正确的.从零位开始,你可以(平凡地)匹配一个零长度的字符串.同样,"" 包含 "".


Jos*_*Lee 10

这不是例外,而是如何将自然结果indexOf和startsWith定义.

你声称"test".indexOf("")应该返回-1.这基本上等同于"test".startsWith("")应该返回的声明false.为什么是这样?虽然这个案例在文档中被特别指出为返回true,但这不仅仅是一个武断的决定.

"test".startsWith("te")例如,你会如何决定?最简单的方法是使用递归.由于两个字符串都以字符开头,因此't'您调用"est".startsWith("e")并返回结果.同样,您将调用"st".startsWith("")并返回结果.但是你已经知道答案应该是true,所以这就是每个字符串开头的原因"".


Jus*_*ini 6

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

返回的整数是最小值k,这样:

 this.startsWith(str, k)
Run Code Online (Sandbox Code Playgroud)

任意以字符串""等于原始字符串(每串开头""),因此,最小k的str = ""是始终为0.

  • *每个字符串*以""开头.同样,每个字符集都是空集的超集.等等......这是一个非常方便的惯例. (4认同)