我已经为此工作过,但我不断收到异常。 谁能告诉我问题出在哪里?
package assingment;
public class frequencyCount {
static void count(int x[]){
System.out.println("ENTERED ARRAY IS ");
for( int i=0; i < x.length; i++)
{
System.out.print(x[i]);
}
int c[] = new int [x.length];
for(int i=0; i<c.length ;i++)
{ c[i] = 0;
}
for(int i=0; i< x.length ;i++){
int m= x[i];
c[m]++;
}
System.out.println("frequency table");
for(int i=0; i< c.length ;i++){
System.out.print(i + " "+ c[i]);
}
}
public static void main(String[] args) {
count(new int []{1,1,5,2,10});
}
}
这是因为您错误地分配了空间以正确存储计数。 您需要创建一个数组,其中元素总数是数组的最大值,加上 1 占 0。 我将假设你所有的数字都是正数,以使事情变得简单。 因此,您实际上需要首先确定数组中的最大值是多少,然后相应地分配空间。
如果不这样做,当您在数组中指定 5
的值时,您只分配了一个大小为 5
的数组,因此如果您尝试使用 5
索引到数组中,则当您尝试访问数组的第六个位置时,您会得到一个OutOfBounds
异常,那里不存在。
FWIW,有更聪明的方法可以做到这一点,例如使用 HashMap
,但我假设您还没有在 Java 课程中涵盖更高级的数据结构,您可能需要一个带有数组的解决方案。 但是,我完全建议使用HashMap
。
因此,请先修改代码以找到最大值,然后相应地分配:
package assingment;
public class frequencyCount {
static void count(int x[]){
System.out.println("ENTERED ARRAY IS ");
// NEW - To store maximum
int maxi = -1;
for( int i=0; i < x.length; i++)
{
System.out.println(x[i]);
// Keep checking for the maximum
if (x[i] > maxi)
maxi = x[i];
}
// NEW - modify length to account for maximum
int c[] = new int [maxi+1];
for(int i=0; i<c.length ;i++)
{
c[i] = 0;
}
for(int i=0; i< x.length ;i++){
int m= x[i];
c[m]++;
}
System.out.println("frequency table");
for(int i=0; i< c.length ;i++){
System.out.println(i + " "+ c[i]);
}
}
public static void main(String[] args) {
count(new int []{1,1,5,2,10});
}
}
您正在尝试访问c[m]
m=x[i]
第 3 周期的位置。但是x[2]=5
和c[5]
会导致异常,因为c[]
中只有 5 个元素(从 c[0]
到 c[4]
)