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
相关产品推荐
相关产品推荐

