You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

String的indexOf()方法无法匹配首字符问题求助

解决indexOf()统计字符出现次数时首字符未被计数的问题

嘿,我明白你现在遇到的麻烦了——用indexOf()统计字符串字符出现次数,结果唯独首字符没被正确统计。咱们来一步步排查问题,然后搞定它!

问题根源分析

从你给出的代码片段来看,大概率是没有把首字符本身的第一次出现算入计数,或者在使用indexOf()时起始索引参数设置不当。比如如果你的循环里是从i+1开始查找当前字符的后续出现,那首字符(i=0时)只会统计它之后出现的次数,漏掉了自己这一次。

修复后的完整代码

这里给你调整后的代码,不仅能正确统计首字符,还能避免重复统计相同字符(比如多次统计同一个字符的出现次数):

public static void main(String[] args) {
    String str = "simultaneously";
    int[] count = new int[str.length()];
    
    // 初始化计数数组为0
    for (int i = 0; i < count.length; i++) {
        count[i] = 0;
    }

    for (int i = 0; i < str.length(); i++) {
        char currentChar = str.charAt(i);
        // 先把当前字符的第一次出现算进去(这就是首字符之前漏掉的部分)
        count[i]++;
        
        // 从当前索引的下一个位置开始,查找后续所有相同字符
        int nextPos = str.indexOf(currentChar, i + 1);
        while (nextPos != -1) {
            count[i]++;
            // 继续找下一个相同字符的位置
            nextPos = str.indexOf(currentChar, nextPos + 1);
        }

        // 标记已统计过的字符,避免重复统计(比如后面再遇到's'就不用再统计了)
        str = str.replace(currentChar, '\0');
    }

    // 输出最终统计结果
    System.out.println("字符出现次数统计:");
    for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i);
        if (c != '\0') {
            System.out.printf("字符 '%c' 出现了 %d 次%n", c, count[i]);
        }
    }
}

关键修复点说明

  • 首字符计数补全:在进入indexOf()循环前,先给count[i]加1,把当前字符本身的出现算进去,这就解决了首字符没被统计的问题。
  • 避免重复统计:用str.replace(currentChar, '\0')把已经统计过的字符替换成空字符,这样后续循环遇到相同字符时就会跳过,不会重复计算同一个字符的出现次数。
  • 正确使用indexOf()参数:str.indexOf(currentChar, i + 1)确保我们从当前字符的下一个位置开始查找,避免重复计数当前位置的字符。

如果你不想替换字符,也可以用一个布尔数组标记已统计的索引,效果是一样的:

boolean[] counted = new boolean[str.length()];
// 然后在循环里判断:
if (counted[i]) continue;
// 统计完后标记counted[i] = true;

这样调整后,首字符就能被正确统计,所有字符的出现次数都会准确无误啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:17:01