我只有一个字符串
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
有什么建议吗?
答案 0 :(得分:4)
在这种情况下,+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);
为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);
答案 1 :(得分:0)
这仅因为
int index = inp.indexOf("A");
返回第一个出现的A的索引,从第0个字符(包括0)开始。 (See the documentation here。)如果您设置了第二个参数
int index = inp.indexOf("A", 5);
indexOf
仅返回在索引5
或之后找到的第一个A。
您正在做什么
int index = inp.indexOf("A", inp.indexOf("A")+1);
...找到第一个出现的“ 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)
。因此,您正在寻找在第一个索引处或之后的第一个“ A”出现(“ ABACAB”中的第一个“ B”)。这将返回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);
或使用第三方库。