为什么Java在将数据存储到数组中时会出现运行时错误;至于;环
我想编写代码,读取存储为字符串变量的单词。程序应该循环遍历单词中的每个字符,并更新包含每个字母出现频率的数组 字母表中的字母(A到Z)可以由“freq[1]”到“freq[26]”引用 但是,当我试图运行我的程序时,我得到一个错误,上面写着: java.lang.ArrayIndexOutOfBoundsException:-64 位于ReadWords.main(ReadWords.java:17)为什么Java在将数据存储到数组中时会出现运行时错误;至于;环,java,arrays,for-loop,Java,Arrays,For Loop,我想编写代码,读取存储为字符串变量的单词。程序应该循环遍历单词中的每个字符,并更新包含每个字母出现频率的数组 字母表中的字母(A到Z)可以由“freq[1]”到“freq[26]”引用 但是,当我试图运行我的程序时,我得到一个错误,上面写着: java.lang.ArrayIndexOutOfBoundsException:-64 位于ReadWords.main(ReadWords.java:17) 以下是我使用的代码: public class ReadWords { public
以下是我使用的代码:
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
}
}
}
公共类ReadWords
{
公共静态void main(字符串[]args)
{
String line=“这是一行文字,不刺激”;
line=line.toLowerCase();
int[]freq=新的int[27];
对于(int i=0;i
因为您正在用字母读取空格字符(ASCII 32)。它的值是32
,当你减去96
,你会得到-64
,显然不是一个有效的数组索引
我认为你不想计算空格,所以跳过它们;不要处理它们
您还需要跳过其他标点符号,其中
'
为ASCII值39,
为ASCII值46。因为您正在用字母读取空格字符(ASCII 32)。它的值是32
,当你减去96
,你会得到-64
,显然不是一个有效的数组索引
我认为你不想计算空格,所以跳过它们;不要处理它们
您还需要跳过其他标点字符,“
为ASCII值39,
为ASCII值46。您的错误
正如格特曼所说,你在分析频率的时候,包括了空间。只需添加一个if语句
for (int i = 0; i < line.length(); i++)
{
int letter = line.charAt(i) - 96;
if (letter > 0 && letter < 27) freq[letter]++;
}
为此:
for (int i = 1; i < freq.length; i++)
或者,如果您按照我所说的那样更改了freq
数组的大小,并在位置0处设置了“a”的频率,请使用以下行:
System.out.println((char)(i + 97) + ": " + freq[i]);
你的错误
正如格特曼所说,你在分析频率的时候,包括了空间。只需添加一个if语句
for (int i = 0; i < line.length(); i++)
{
int letter = line.charAt(i) - 96;
if (letter > 0 && letter < 27) freq[letter]++;
}
为此:
for (int i = 1; i < freq.length; i++)
或者,如果您按照我所说的那样更改了freq
数组的大小,并在位置0处设置了“a”的频率,请使用以下行:
System.out.println((char)(i + 97) + ": " + freq[i]);
我想最简单的方法是只检查小写字母(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
}
}
publicstaticvoidmain(字符串[]args){
String line=“这是一行文字,不刺激”;
line=line.toLowerCase();
int[]freq=新的int[27];
对于(int i=0;i96
&&第1行字符(i)<123){
/*减去97以从0开始数组(值97)*/
int字母=line.charAt(i)-97;
频率[字母]+;
}
}
对于(int i=0;i
我想最简单的方法是只检查小写字母(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
}
}
publicstaticvoidmain(字符串[]args){
String line=“这是一行文字,不刺激”;
line=line.toLowerCase();
int[]freq=新的int[27];
对于(int i=0;i96
&&第1行字符(i)<123){
/*减去97以从0开始数组(值97)*/
int字母=line.charAt(i)-97;
频率[字母]+;
}
}
对于(int i=0;i
很明显,int字母=line.charAt(i)-96;生成字母=-64。我不知道这意味着什么…@mikeyaworski现在已经添加了评论:)很明显,int-letter=line.charAt(I)-96;生成字母=-64。我不知道这意味着什么…@mikeyaworski现在添加了评论:)