重载 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);

或者使用第三方库。