0

これは私が解決しようとしている質問です:

mainメソッドとhistogramと呼ばれる静的メソッドを含むというクラスを記述します。このクラスArrayHistogramには次のシグネチャがあります。main public static int[] histogram(int[][] arrayA) メソッドで、2次元配列を宣言して初期化し、それを呼び出しますarrayA。この配列には、負でない整数が含まれている必要があります。ヒストグラムメソッドはarrayA、の要素の出現頻度を受け入れarrayAて1次元配列(histA)に入れ、を返しますhistA。出現頻度とは、要素が配列内で出現する回数を意味します。プログラムは、不規則な配列でも機能するはずです。プログラムはhistA、変数を宣言する前に、自動的にサイズを決定する必要がありますhistA

ヒント:図1は、サンプルの2D array(arrayA)と対応する。を示していますhistAhistA[0] = 2は、0がAで2回発生したことを示します。または、、はhistA[3] = 1、番号3がAで1回出現したことを示します。

私はこれまでにこれを行いました

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

まず、私はこれを正しく行っていますか?

そうでない場合、どうすればそれを実現できますか?

4

2 に答える 2

0

配列には から始まるインデックスが付けられることに注意し0てください。そのため、max値は配列で使用できるインデックスにはなりませんhistA。これを修正する 1 つの方法は、次のように配列を作成することです。

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

row2 番目のループで、 being2colbeingをヒットすると、配列を size に定義しない限り、その配列で有効なインデックスではないもの4を使用しようとします。これは、あなたの場合はです。histA[9]10max + 1

于 2013-01-31T03:28:43.877 に答える
0

lengthサイズを返す配列オブジェクトの属性です。0から配列lengthの配列まで配列をループしているため、存在しない配列のインデックスを参照しています。したがって、ArrayIndexOutOfBoundException.

forループ終了式をarrayA.length-1andに更新するだけarrayA[row].length-1で、すべて正常に機能します。

また、そのようなすべてについて、 Java Docexceptionsをチェックするだけで答えが得られます。

于 2013-01-31T03:39:32.910 に答える