我目前正在为一个类创建一个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;
}