我目前正在为一个类创建一个TextLine类,该类表示必须以字符数组表示的一行文本。不允许通过间接或以任何方式直接使用字符串类来表示TextLine对象,但是,我可以使用它来处理参数。

对于其中的一种方法,我假设将字符串作为参数的参数,该参数也是TextLine对象的片段,然后返回该TextLine中第一次出现的片段的索引位置,或者- 1,如果找不到该片段。

现在,我正在尝试找出indexOf方法,但是我的问题是我的方法只检查一次起点。因此,如果TextLine对象的字母第一次与片段的字母不匹配,但是对象中其他位置还有另一个匹配项,则该方法不会检查该起点。

例如,假设我输入penplay作为TextLine,然后输入play作为片段。显然,在TextLine中发生了播放,但是我的indexOf方法所做的是,它检查笔迹在索引0处的第一个p,然后继续查看后面的字母是否匹配播放长度,以及是否匹配不,它返回-1。知道如何允许算法继续搜索另一个起点吗?

这就是我的代码:

public int indexOf(String fragment){

char[] temp = fragment.toCharArray();

int j = 0;
for(int i = 0; i < someText.length; i++){
    while(someText[i] == temp[j]){

        for(j = 1; j < temp.length; j++){
            if(temp[j] != someText[i+j]){
                return -1;
            }
        }

        return i;

    }
}

return -1;

}

最佳答案

在不需要时,您将第一个字符放在特殊的外壳中。基本上,您需要说:


对于每个潜在的开始角色...

从该候选位置开始,整个fragment是否匹配?



所以像这样:

// Only deal with *viable* starting points
for (int i = 0; i < someText.length - temp.length; i++) {
    boolean found = true;
    for (int j = 0; j < temp.length && found; j++) {
        if (temp[j] != someText[i + j]) {
            found = false;
        }
    }
    if (found) {
        return i;
    }
}
return -1;


这可以通过提取内部循环来重构:

for (int i = 0; i < someText.length - temp.length; i++) {
    if (textMatches(temp, i)) {
        return i;
    }
}
return -1;

...
// TODO: Javadoc to explain parameters :)
private boolean textMatches(char[] chars, int startingIndex) {
    for (int i = 0; i < chars.length; i++) {
        if (chars[i] != someText[i + startingIndex]) {
            return false;
        }
    }
    return true;
}

10-02 07:13