计算java中2d数组的出现次数

时间:2013-01-31 03:20:45

标签: java arrays indexoutofboundsexception

这是我想要解决的问题:

编写一个名为ArrayHistogram的类,它包含一个main方法和一个名为histogram的静态方法,它具有以下签名: public static int[] histogram(int[][] arrayA) 在main方法中,声明并初始化二维数组,将其称为arrayA。此数组必须包含一些非负整数。直方图方法接受arrayA并将arrayA元素的出现频率放入一维数组(histA)并返回histA。出现频率是指元素在数组中出现的次数。你的程序也适用于不规则的数组。在声明变量histA之前,您的程序应自动确定histA的大小。

提示:图1显示了一个示例2D数组(arrayA)和相应的histAhistA[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

首先我做得对吗?

如果不是,我该如何实现呢?

2 个答案:

答案 0 :(得分:0)

请注意,数组从0开始编制索引,因此您的max值不会是histA数组中可用的索引。解决此问题的一种方法是创建您的数组:

int histA[] = new int[max + 1];

在您的第二个循环中,当您点击row2col4时,它会尝试使用histA[9]除非您将数组定义为10大小,在您的情况下为max + 1,否则该数组中的有效索引不是。

答案 1 :(得分:0)

length是返回大小的数组对象的属性。现在,因为您将数组从0开始循环到数组的length,所以它引用的数组索引甚至不存在。因此ArrayIndexOutOfBoundException

只需将for循环终止表达式更新为arrayA.length-1arrayA[row].length-1,它们一切正常。

对于所有这样的exceptions,只需查看他们的Java Doc,您就会得到答案。