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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:50:22