Java统计用户输入字符串最高频字符时数组越界如何解决
问题原因与修复方案
报错根本原因
你定义的freqLetter数组长度只有26,仅适配全小写字母的计算逻辑,超出这个范围的字符都会导致下标越界:
- 大写字母ASCII码比对应小写字母小32,例如
'E' - 'a' = 69 - 97 = -28,和你第一个报错的下标完全吻合 - 空格、标点等非字母字符的ASCII码远小于'a'的97,计算出的下标都是负数,完全超出数组0~25的合法取值范围
修复方案
方案1:仅统计英文字母(大小写合并计算,忽略空格/标点)
这是最贴合你原有代码设计逻辑的方案,只需要修改统计循环的逻辑,增加大小写转换和合法字符校验即可:
import java.util.Scanner; public class CharCount { static void maxOccuringChar(char str[]) { char maxChar = ' '; int freqLetter[] = new int[26]; int lengthString = str.length; int maximum = -1; for (int i = 0; i < lengthString; i++) { // 先把当前字符转小写 char cur = Character.toLowerCase(str[i]); // 只统计小写a-z范围内的字符,其他字符跳过 if (cur >= 'a' && cur <= 'z') { freqLetter[cur - 'a']++; } } for (int i = 0; i < 26; i++) { if (maximum < freqLetter[i]) { maximum = freqLetter[i]; maxChar = (char) (i + 'a'); } } System.out.print(maxChar + " = " + maximum); } public static void main(String[] args) { Scanner in = new Scanner(System.in); char[] StringInput = in.nextLine().toCharArray(); maxOccuringChar(StringInput); in.close(); } }
测试效果:
- 输入
Elephant,输出e = 2 - 输入
I am confused,输出m = 2 - 输入
hello,输出l = 2,和原有正常输出一致
方案2:统计所有ASCII字符(包括空格、标点、区分大小写)
如果需要统计输入内容里的所有字符,不需要过滤,直接把计数数组长度改为128覆盖所有ASCII字符即可,不需要做字符转换和过滤:
static void maxOccuringChar(char str[]) { char maxChar = ' '; int freq[] = new int[128]; // 覆盖所有ASCII可打印字符范围 int lengthString = str.length; int maximum = -1; for (int i = 0; i < lengthString; i++) { freq[str[i]]++; // 直接用字符ASCII值当下标,不需要计算偏移 } for (int i = 0; i < 128; i++) { if (maximum < freq[i]) { maximum = freq[i]; maxChar = (char) i; } } System.out.print(maxChar + " = " + maximum); }
内容的提问来源于stack exchange,提问作者Ralph Henry
相关产品推荐
相关产品推荐

