gpt4 book ai didi

java - Java中允许indexOf多次检查匹配

转载 作者:行者123 更新时间:2023-12-01 17:35:37 24 4
gpt4 key购买 nike

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

对于其中一个方法,我应该接受一个字符串作为参数的参数,它也是 TextLine 对象的片段,然后返回该片段在此 TextLine 中第一次出现的索引位置,如果未找到片段,则为 -1。

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

例如,假设我输入 penplay 作为 TextLine,然后输入 play 作为片段。显然,TextLine 中出现了 play,但我的 indexOf 方法所做的是,它检查索引 0 处的 penplay 中的第一个 p,然后继续查看后面的字母是否与 play 的长度匹配,如果没有,它返回-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;

}

最佳答案

当没有必要时,您对第一个字符进行了特殊处理。基本上你需要说:

  • 对于每个潜在的起始角色...
    • 从候选位置开始,整个片段是否匹配?

所以类似:

// 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;
}

关于java - Java中允许indexOf多次检查匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6686170/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com