我想编写一个读取存储为String变量的单词的代码。程序应循环遍历单词中的每个字符,并更新包含每个字母出现频率的数组。
字母表中的字母(A到Z)可以通过“freq [1]”引用“freq [26]”。
然而,当我尝试运行我的程序时,我收到一条错误消息:
java.lang.ArrayIndexOutOfBoundsException:-64 在ReadWords.main(ReadWords.java:17)
以下是我使用的代码:
public class ReadWords
{
public static void main (String[] args)
{
String line = "This is a line of text. That's not exciting";
line = line.toLowerCase();
int[] freq = new int[27];
for (int i = 0; i < line.length(); i++)
{
int letter = line.charAt(i) - 96;
freq[letter]++;
}
for (int i = 0; i < freq.length - 1; i++)
{
System.out.println(freq[i]); //prints all elements in the array
}
}
}
答案 0 :(得分:3)
因为您正在使用字母读取空格字符(ASCII 32)。其值为32
,当您减去96
时,您会得到-64
,显然不是有效的数组索引。
我认为你不想计算空格,所以跳过它们;不要处理它们。
您还希望跳过其他标点符号,'
为ASCII值39,.
为ASCII值46。
答案 1 :(得分:1)
就像rgettman所说,你在频率分析中包含了空格。只需添加一个if语句。
for (int i = 0; i < line.length(); i++)
{
int letter = line.charAt(i) - 96;
if (letter > 0 && letter < 27) freq[letter]++;
}
if (letter > 0 && letter < 27)
确保您char
中的String
实际上是来自a - z的信件
,在你的第二个for-loop
中,它不会显示'z'的频率,它会将频率显示为数组中的位置0,它不保留任何内容(位置1是'a')。
你需要改变这个:
for (int i = 0; i < freq.length - 1; i++)
到此:
for (int i = 1; i < freq.length; i++)
这样它包括元素27,它是freq[26]
,它是'z'频率所在的位置。它也会忽略元素1,即freq[0]
。试试吧。
或者你可以将freq
数组的大小更改为26,然后从line.charAt(i)
中减去97,然后更改我在第一个时提供的if-statement
for-loop
到
if (letter > -1 && letter < 26)
。然后使用for (int i = 0; i < freq.length; i++)
。
使用此行代码显示与频率对应的字符:
System.out.println((char)(i + 96) + ": " + freq[i]);
或者,如果你按照我所说的改变了freq
数组的大小,并将位置0的频率设为'a',请使用以下行:
System.out.println((char)(i + 97) + ": " + freq[i]);
答案 2 :(得分:1)
我想最简单的方法是只检查小写字母(97-122 ASCII值)。
以下是您的代码的修改版本。
public static void main(String[] args) {
String line = "This is a line of text. That's not exciting";
line = line.toLowerCase();
int[] freq = new int[27];
for (int i = 0; i < line.length(); i++) {
/*Only use lower case alphabets ranging from 97 to 122.
The below if should omit all other unwanted characters from your string.*/
if (line.charAt(i) > 96
&& line.charAt(i) < 123) {
/* Subtract by 97 to start your array from 0 for a(value 97)*/
int letter = line.charAt(i) - 97;
freq[letter]++;
}
}
for (int i = 0; i < freq.length - 1; i++) {
System.out.println((char)(i+97) + " : " + freq[i]); // prints all elements in the array
}
}