Java字符直方图统计方法报错求助:数组越界与统计结果异常
解决Java字符直方图统计中的数组越界与计数错误问题
第一个代码的数组越界原因
你遇到的ArrayIndexOutOfBoundsException是因为直接用字符的ASCII数值作为数组索引。在Java中,char类型本质是UTF-16编码的数值,比如小写字母'a'的ASCII值是97,'z'是122。而你的letterCounts数组长度只有26,索引范围是0-25,用97当索引肯定超出数组边界。
修复方案
把字符转换成0-25的索引即可,用当前字符减去'a'的ASCII值:c - 'a'。比如'a'-'a'=0(对应数组第一个位置),'z'-'a'=25(对应最后一个位置)。同时可以去掉嵌套的字母数组循环,直接判断字符是否在小写字母范围内,优化代码:
public static int [] letterCount (String str) { int letterCounts [] = new int [26]; str = str.toLowerCase(); for (char c : str.toCharArray()) { // 只统计小写字母,避免非字母字符导致越界 if (c >= 'a' && c <= 'z') { letterCounts[c - 'a']++; } } return letterCounts; }
第二个代码的计数错误原因
输入"aa"时输出前两个元素为1,是因为你错误地用**字符串的循环索引i**操作counts数组。当遍历字符串的第一个'a'(i=0),你给counts[0]加1;遍历第二个'a'(i=1),又给counts[1]加1,完全没对应到字母'a'的正确索引位置。
修复方案
同样用letter - 'a'得到字母对应的数组索引,替换counts[i]++,同时修正字母数组的拼写错误(原代码里的abc数组存在字母缺失):
public void IndexOfString(String s){ int [] counts = new int [26]; char [] abc = "abcdefghijklmnopqrstuvwxyz".toCharArray(); for (int i = 0; i < s.length(); i++){ char letter = s.charAt(i); // 转小写统一处理 letter = Character.toLowerCase(letter); for (char j : abc){ if (letter == j){ // 用字母对应的索引而非字符串索引 counts[letter - 'a']++; // 匹配到后可以跳出循环,减少不必要的遍历 break; } } } for (int i = 0; i < 26; i++){ System.out.println(counts[i]); } }
额外优化建议
- 不需要额外维护字母数组,直接通过字符范围判断(
c >= 'a' && c <= 'z')就能筛选字母,代码更简洁高效。 - 处理输入时最好过滤非字母字符,避免因输入数字、符号导致的越界问题。
内容的提问来源于stack exchange,提问作者AnabolicProgrammer
相关产品推荐
相关产品推荐

