0

私は一日中これにいましたが、この時点で少しイライラしています. 配列に関するいくつかのビデオを見たり、テキストを読んだりしましたが、プログラムに関するいくつかの問題について混乱しています。1000 個のランダムな整数を生成し、それらの整数を配列に格納し、生成されたランダムな整数の頻度を計算するプログラムを開発しています。IDE にエラーは表示されませんが、コンパイルすると範囲外のエラーが発生します。

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at randomintegers.RandomIntegers.calcFrequency(RandomIntegers.java:32)
at randomintegers.RandomIntegers.main(RandomIntegers.java:23)

Java Result: 1 BUILD SUCCESSFUL (合計時間: 0 秒)

これまでの私のコードは次のとおりです。

        public static void main(String[] args) {

    int randomNumbers[] = new int [1000];
    int i;
    for (i=0;i<1000;i++){
    randomNumbers[i] = 1 + (int)(Math.random() * 10);
    calcFrequency(randomNumbers);
    }
}


public static void calcFrequency(int[] inputArray){
    int freq[]=new int[10];
    int i;
    for (i=0;i<inputArray.length;i++){
        ++freq[inputArray[i]-1];    
    }
    System.out.println("number/tfrequncy");
    System.out.println(freq);
}
4

4 に答える 4

0

calcFrequency配列を埋めている for ループ内から呼び出しています。

for (i=0;i<1000;i++){
    randomNumbers[i] = 1 + (int)(Math.random() * 10);
    // The first iteration of this loop has only put one value in random numbers
    // So the following will be a mostly empty array:
    calcFrequency(randomNumbers);
}

int の空の配列はすべてゼロに設定されるため、freq[inputArray[i]-1] の場合、i が 1 の場合は freq[0-1] または -1 インデックス エラーが発生します。

代わりに、配列がすべて完了したら、calcFrequency を使用する必要があります。

for (i=0;i<1000;i++){
    randomNumbers[i] = 1 + (int)(Math.random() * 10);
}
calcFrequency(randomNumbers);
于 2013-10-12T22:51:15.660 に答える
0

まず、なぜ calcFrequency を for ループの中に入れるのですか。プログラムが十分な乱数を入れる前に到達します。

配列が満たされていないため、calcFrequency 関数は必要なオブジェクトを見つけることができず、エラーが発生します

于 2013-10-12T22:53:26.440 に答える
0

さて、いくつかのこと:

1) 配列を反復処理するときは、配列の長さを条件として使用します。

for( int i = 0; i < array.length; ++i )

それよりも

for( int i = 0; i < someArbitraryNumberThatYoullHaveToUpdateLaterIfYouChangeTheArray; ++i )

2) 乱数を生成している[1、10][0, 9] に 1 を追加して [1, 10] の範囲を取得し、それらを使用してcalcFrequency[0, 9] 要素を持つ配列にインデックスを付けます。これは、アレイのハイエンドをオーバーランします。1 を引くことでこれを解決しようとしましたが、0 になるとどうなりますか?

3) 配列内の数値を調整しようとするのではなく、出力するときに単純に数値を増やします。

System.out.println( (randoms[i] + 1) + " occured " + counts[i] + " times" );
于 2013-10-12T22:57:28.670 に答える
0
for (i=0;i<1000;i++){
  randomNumbers[i] = 1 + (int)(Math.random() * 10);
  calcFrequency(randomNumbers);
}

上記のコードを次のように変更します。

for (i=0;i<1000;i++){
  randomNumbers[i] = 1 + (int)(Math.random() * 10);
}
calcFrequency(randomNumbers);

最初に配列のすべての要素を初期化してから、頻度を計算する必要があります。それ以外の場合、初期化されていないすべての要素にはデフォルト値があります0

次の行が例外の原因でした。

++freq[inputArray[i]-1];

現在の要素がデフォルト値の場合0、この行は次のようになります。

++freq[-1];

これはあなたに与えますjava.lang.ArrayIndexOutOfBoundsException: -1

ところで、配列を出力したい場合、以下はうまくいきません:

System.out.println(freq);

代わりに、次のことを行うことができます。

System.out.println(Arrays.toString(freq));
于 2013-10-12T22:59:13.903 に答える