You need to enable JavaScript to run this app. Java中使用indexOf统计字符串替换次数的计数逻辑优化
优惠活动
大模型
产品
解决方案
定价
更多

Java中使用indexOf统计字符串替换次数的计数逻辑优化

核心问题根源

现有计数逻辑的偏差来自两个硬编码设计缺陷:

  • 跳过已匹配内容的偏移量固定写为+1,没有结合待匹配子串的实际长度做动态调整
  • 沿用了自带i++的for循环推进索引,和手动调整的索引位置叠加,造成重复跳转
旧逻辑的出错原因
  • 当待匹配子串长度大于1时,仅跳过1个字符会引发重叠匹配的错误计数:比如原串"aaa"匹配长度为2的"aa",匹配到位置0的片段后仅跳1位到索引1,会再次匹配到位置1的"aa",把本该计数1次的结果错算成2次,和replace方法的非重叠替换逻辑完全不匹配。
  • 当待匹配子串长度等于1时,循环自带的i++会造成索引双重跳转:比如匹配长度为1的"a"、原串"aaa",第一次匹配到位置0后手动把i设为0+1=1,循环收尾时for的i++又把i推到2,直接跳过了位置1的匹配,最终3个a只统计到2次。
适配任意子串长度的正确计数逻辑

完全对齐replace方法的非重叠匹配规则:每次找到匹配后直接跳转到当前匹配片段的末尾位置(即匹配起始位置 + 待匹配子串的长度),不使用固定偏移,也不依赖for循环的自增推进索引,实现代码如下:

int cnt = 0;
int searchPos = 0; // 从字符串头部开始搜索
int matchLen = curStrL.length(); // 获取待匹配子串的真实长度

// 当剩余字符串长度不足匹配长度时,直接退出循环
while (searchPos <= inputL.length() - matchLen) {
    int foundIndex = inputL.indexOf(curStrL, searchPos);
    // 找不到匹配就终止搜索
    if (foundIndex == -1) {
        break;
    }
    cnt++;
    // 下一次搜索直接从本次匹配片段的结束位置开始,完全跳过已匹配内容
    searchPos = foundIndex + matchLen;
}
逻辑准确性验证

覆盖所有边界场景测试结果:

  • 场景1:原串"aaa",匹配长度为2的"aa":第一次在位置0找到匹配,计数+1,下次搜索位置为0+2=2,此时剩余长度只有1个字符、不足匹配长度,循环终止,最终计数1,和实际替换结果一致。
  • 场景2:原串"aaa",匹配长度为1的"a":依次在位置0、1、2找到匹配,每次搜索位置跳1位,最终计数3,完全符合预期。
  • 场景3:匹配参考示例2(输入"AAccaabbaaaaatt",匹配"aa"):依次在位置0、4、8、10找到匹配,最终计数4,和示例要求的统计结果完全一致。

该实现全程仅使用要求的indexOf、replace、toLowerCase三个方法,没有引入额外API,且计数结果和Java原生replace的实际替换次数100%对齐。

内容的提问来源于stack exchange,提问作者jjjunior

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 23:06:04