这是我想要解决的问题:
编写一个名为ArrayHistogram
的类,它包含一个main方法和一个名为histogram的静态方法,它具有以下签名:
public static int[] histogram(int[][] arrayA)
在main方法中,声明并初始化二维数组,将其称为arrayA
。此数组必须包含一些非负整数。直方图方法接受arrayA
并将arrayA
元素的出现频率放入一维数组(histA
)并返回histA
。出现频率是指元素在数组中出现的次数。你的程序也适用于不规则的数组。在声明变量histA
之前,您的程序应自动确定histA
的大小。
提示:图1显示了一个示例2D数组(arrayA
)和相应的histA
。 histA[0] = 2
显示0在A中出现两次。或者,histA[3] = 1
表示数字3在A中出现过一次。
到目前为止我已经这样做了
public class ArrayHistogram
{
public static void main (String[]args)
{
// declearing and initializing a 2D array.
int [][] arrayA = {{5,8,8,4,3},{1,4,2,2,3},{7,4,6,6,9}};
histogram(arrayA);
}
public static int[] histogram (int [][] arrayA)
{ // nested for loop to go through the array.
int max = 0;
for ( int row = 0; row<arrayA.length; row++){
for ( int col=0; col < arrayA[row].length; col++){
if ( arrayA[row][col]> max ){
max = arrayA[row][col];
}
}
}
int histA[] = new int [max];
for ( int row = 0; row<arrayA.length; row++){
for ( int col=0; col < arrayA[row].length; col++){
histA[arrayA[row][col]]++;
}
}
System.out.println(histA);
return histA;
}
}
这一行:
histA[arrayA[row][col]]++;
显示java.lang.ArrayIndexOutOfBoundsException
首先我做得对吗?
如果不是,我该如何实现呢?
答案 0 :(得分:0)
请注意,数组从0
开始编制索引,因此您的max
值不会是histA
数组中可用的索引。解决此问题的一种方法是创建您的数组:
int histA[] = new int[max + 1];
在您的第二个循环中,当您点击row
为2
而col
为4
时,它会尝试使用histA[9]
除非您将数组定义为10
大小,在您的情况下为max + 1
,否则该数组中的有效索引不是。
答案 1 :(得分:0)
length
是返回大小的数组对象的属性。现在,因为您将数组从0开始循环到数组的length
,所以它引用的数组索引甚至不存在。因此ArrayIndexOutOfBoundException
。
只需将for
循环终止表达式更新为arrayA.length-1
和arrayA[row].length-1
,它们一切正常。
对于所有这样的exceptions
,只需查看他们的Java Doc,您就会得到答案。