为何Java子串多次出现检测代码的Index初始化位置影响结果?
子串多次出现检测的代码问题解析
我尝试编写一段Java代码检测字符串中是否存在某个子串的多次出现:当子串出现超过一次时方法返回true,否则返回false。该方法在子串完全不存在时工作正常,但在子串仅出现一次时错误返回true,不符合预期。
最初的错误实现
public boolean twoOccurrencesMethod(String a, String b){ int fromIndex = 0; int count = 0; int Index = b.indexOf(a, fromIndex); while((Index) != -1){ count++; fromIndex = Index + 1; if (count > 1){ return true; } } return false; }
调整后的正确实现
public boolean twoOccurrencesMethod(String a, String b){ int fromIndex = 0; int count = 0; int Index; while((Index = b.indexOf(a, fromIndex)) != -1){ count++; fromIndex = Index + 1; if (count > 1){ return true; } } return false; }
问题原因分析
两种写法的核心差异在于循环过程中是否重新执行indexOf来更新Index的取值:
第一种错误写法:
循环外仅执行一次b.indexOf(a, fromIndex)获取初始Index值,进入循环后,只会更新fromIndex,但从未重新调用indexOf去查找下一个子串的位置。当子串仅出现一次时,第一次进入循环count变为1,不触发return true;但由于Index始终保持第一次的非-1值,循环条件永远成立,会再次进入循环体,count变为2,触发return true,这就是不符合预期的原因。第二种正确写法:
每次执行循环条件时,都会先执行Index = b.indexOf(a, fromIndex),用更新后的fromIndex去查找下一个子串的位置。当子串仅出现一次时,第一次循环结束后,第二次执行循环条件时indexOf会返回-1,循环直接终止,最终返回false,符合预期。
内容的提问来源于stack exchange,提问作者Jesuite Akhidenor
相关产品推荐
相关产品推荐

