IndexOf方法在C#/Java中应该返回-1时返回0
我的一个朋友带着这种奇怪的行为来找我,我无法解释,任何有见识的观点都会很感激 Im运行VS2005(C#2.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
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#有关。抱歉,我无法理解您的推理。每个字符串都以“”开头。同样,每个集合都是空集的超集。等这是一个非常方便的约定。和的副本