我有一根绳子
var inp = "ABCABCABC";"A“的第二次出现在下面
int index = inp.indexOf("A", inp.indexOf("A")+1);但是如果我需要第三次出现"A",为什么我不能这样做呢?
int index = inp.indexOf("A", inp.indexOf("A")+2); ---Not Working WHY....?但这是
int index = inp.indexOf("A", inp.indexOf("A", inp.indexOf("A")+1)+1); --- Working 有什么建议吗?
发布于 2018-09-24 06:30:52
在这种情况下,+1只是添加了1,仅此而已。它不会跳过n事件。
我建议你用一个循环。
public static int findNth(String text, String find, int nth) {
int last = -1;
for (int i = 0; i < nth; i++) {
last = text.indexOf(find, last + 1);
if (last == -1) return -1;
}
return last;
}您应该能够在调试器中看到这一点,但是在您的情况下
int index = inp.indexOf("A", inp.indexOf("A")+1);这和
int index = inp.indexOf("A", 0+1);或
int index = inp.indexOf("A", 1);as 0 + 1 == 1
如果您将代码更改为
int index = inp.indexOf("A", inp.indexOf("A")+2);你会得到
int index = inp.indexOf("A", 0+2);只有在有AA的情况下,它才能工作。
这条线
int index = inp.indexOf("A", inp.indexOf("A", inp.indexOf("A")+1)+1);评估为
int index = inp.indexOf("A", inp.indexOf("A", 0+1)+1);或
int index = inp.indexOf("A", 3+1);或
int index = inp.indexOf("A", 4);发布于 2018-09-24 06:38:26
这只因为
int index = inp.indexOf("A");返回A的第一次出现的索引,以第0字符(包括在内)开始。(如果设置第二个参数,则为见这里的文档
int index = inp.indexOf("A", 5);indexOf只返回它在索引5时或之后找到的第一个A。
你在做的是
int index = inp.indexOf("A", inp.indexOf("A")+1);...which找到"A“的第一个出现,然后移动到字符串中的下一个字符,然后查找第二个出现的"A”。只有当字符串中有多个"A“时,这才会起作用。
假设您有一个字符串,如
String phil = "ABACAB";`然后phil.indexOf("A")返回0,phil.indexOf("A", phil.indexOf("A")+1)简化为phil.indexOf("A", 0+1)或只是phil.indexOf("A", 1)。所以你在寻找第一个指数(ABACAB中的第一个"B“)第一次出现的"A”。这将返回2。
做以下事情:
int index = inp.indexOf("A", inp.indexOf("A")+2);做同样的事情,但移动两个字符后,发现第一次出现的"A“。因此,对于我们的示例,这简化为phil.indexOf("A", 2),它将返回2,找到它在第一个例子中找到的相同的第二个"A“。
要找到第三次发生的情况,您需要链接调用,正如您所注意到的:
int index = inp.indexOf("A", inp.indexOf("A", inp.indexOf("A")+1)+1);或者使用第三方图书馆。
https://stackoverflow.com/questions/52473687
复制相似问题