indexOf的重载

时间:2018-09-24 06:24:13

标签: java 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 

有什么建议吗?

2 个答案:

答案 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")返回0phil.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);

或使用第三方库。