Java查找子串第二次出现方法报cannot find symbol错误如何解决
错误原因排查
- 变量作用域问题:你在内部
for (int e = first; ...)循环里声明的int second,作用域仅局限于该循环内部,循环外执行return second时自然找不到该变量,报符号找不到错误 - 逻辑冗余问题:外层的
for (int i = 0; i < strArray.length; i++)和if (i>1)的判断完全没有实际作用,属于冗余逻辑 - 查找逻辑错误:你调用
indexOf时没有限定查找起始范围,就算赋值到second也只会返回第一次出现的索引,无法定位到第二次的结果 - 边界判断缺失:没有处理数组为空、目标字符串不存在、仅出现一次等边界情况,容易触发空指针、数组越界异常
优化实现方案
方案1:转List实现(代码更简洁)
import java.util.Arrays; import java.util.List; int findSecond(String[] strArray, String str) { // 提前处理边界异常 if (strArray == null || strArray.length < 2 || str == null) { return -1; } List<String> strList = Arrays.asList(strArray); int first = strList.indexOf(str); // 无第一次出现,或第一次已是最后一个元素,不可能存在第二次 if (first < 0 || first == strArray.length - 1) { return -1; } // 截取第一次出现位置之后的子列表查找第二次匹配 int secondInSub = strList.subList(first + 1, strList.size()).indexOf(str); return secondInSub < 0 ? -1 : first + 1 + secondInSub; }
方案2:纯数组遍历实现(性能更优,无需额外转集合)
int findSecond(String[] strArray, String str) { if (strArray == null || strArray.length < 2 || str == null) { return -1; } int matchCount = 0; for (int i = 0; i < strArray.length; i++) { // 字符串内容比较必须使用equals方法 if (str.equals(strArray[i])) { matchCount++; if (matchCount == 2) { return i; } } } // 不足两次匹配返回-1 return -1; }
注意事项
- 字符串相等判断必须使用
equals方法,不要使用==,后者仅判断对象引用地址是否相同,不会校验字符串内容是否一致 - 实际业务中可根据场景补充空字符串、大小写匹配等自定义校验规则
内容的提问来源于stack exchange,提问作者Anya
相关产品推荐
相关产品推荐

