重载 indexOf
Overloading of indexOf
我有一根绳子
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
有什么建议吗?
在这种情况下,+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);
这只有效,因为
int index = inp.indexOf("A");
returns 第一次出现 A 的索引,从第 0 个字符(含)开始。 (See the documentation here.) 如果设置第二个参数
int index = inp.indexOf("A", 5);
indexOf
只会 return 它在索引 5
.
处或之后找到的第一个 A
你正在做的是
int index = inp.indexOf("A", inp.indexOf("A")+1);
...找到第一次出现的 "A",然后移动到字符串中的下一个字符,然后寻找第二次出现的 "A"。这仅在字符串中有多个 "A" 时才有效。
假设你有一个像
这样的字符串
String phil = "ABACAB";`
然后phil.indexOf("A")
returns 0
,而phil.indexOf("A", phil.indexOf("A")+1)
简化为phil.indexOf("A", 0+1)
或只是phil.indexOf("A", 1)
。因此,您正在寻找第一个索引处或之后第一次出现的 "A"("ABACAB" 中的第一个 "B")。这将 return 2
.
做类似的事情:
int index = inp.indexOf("A", inp.indexOf("A")+2);
做同样的事情,但是在找到第一次出现的 "A" 之后向前移动 两个 个字符。因此,对于我们的示例,这简化为 phil.indexOf("A", 2)
,它将 return 2
,找到与第一种情况相同的第二个 "A"。
要找到第三次出现,您需要链接调用,如您所述:
int index = inp.indexOf("A", inp.indexOf("A", inp.indexOf("A")+1)+1);
或者使用第三方库。
我有一根绳子
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
有什么建议吗?
在这种情况下,+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);
这只有效,因为
int index = inp.indexOf("A");
returns 第一次出现 A 的索引,从第 0 个字符(含)开始。 (See the documentation here.) 如果设置第二个参数
int index = inp.indexOf("A", 5);
indexOf
只会 return 它在索引 5
.
你正在做的是
int index = inp.indexOf("A", inp.indexOf("A")+1);
...找到第一次出现的 "A",然后移动到字符串中的下一个字符,然后寻找第二次出现的 "A"。这仅在字符串中有多个 "A" 时才有效。
假设你有一个像
这样的字符串String phil = "ABACAB";`
然后phil.indexOf("A")
returns 0
,而phil.indexOf("A", phil.indexOf("A")+1)
简化为phil.indexOf("A", 0+1)
或只是phil.indexOf("A", 1)
。因此,您正在寻找第一个索引处或之后第一次出现的 "A"("ABACAB" 中的第一个 "B")。这将 return 2
.
做类似的事情:
int index = inp.indexOf("A", inp.indexOf("A")+2);
做同样的事情,但是在找到第一次出现的 "A" 之后向前移动 两个 个字符。因此,对于我们的示例,这简化为 phil.indexOf("A", 2)
,它将 return 2
,找到与第一种情况相同的第二个 "A"。
要找到第三次出现,您需要链接调用,如您所述:
int index = inp.indexOf("A", inp.indexOf("A", inp.indexOf("A")+1)+1);
或者使用第三方库。