3

こんにちは、Java の初心者で、ゆっくりと進歩しています。行と列を追加する前に、2D 配列に乱数を入力しようとしています。これまでのところ、配列を作成して表示することができ、加算ビットがソートされていると確信しています。しかし、乱数で埋めようとすると、範囲外の例外が発生します。どこが間違っていますか?

public static void main(String[] args)
{
    //create the grid
    final int row = 9;
    final int col = 9;
    int [][] grid = new int [row][col];

    //fill the grid
    for (int i=0; i<grid.length; i++)
    grid[i][grid[i].length] = (int)(Math.random()*10);

    //display output
    for(int i=0;i<grid.length; i++)
    {
        for(int j=0; j<grid[i].length; j++)
        System.out.print(grid[i][j]+"");
        System.out.println();
    }

    int sum = 0;
    for (int i = 0; i < grid.length; i++) {
        System.out.println("This row sums up to: " + sum);


        for (int j = 0; j < grid[i].length; j++) {
            sum += grid[j][i];
        }
        System.out.println("This column sums up to: " + sum);
    }
}
4

1 に答える 1

9
grid[i][grid[i].length] = (int)(Math.random()*10);

これは範囲外の例外になります。配列の最大インデックスaa.length - 1(配列のインデックスが 0 であるため) です - のインデックスにアクセスしようとしていますa.length。ここaにありgrid[i]ます。

いずれにせよ、配列を完全に埋めたい場合は、2 つのforループが必要になります。

for (int i = 0; i < grid.length; i++) {
    for (int j = 0; j < grid[i].length; j++) {
        grid[i][j] = (int)(Math.random()*10);
    }
}

外側のforループは 2D 配列に含まれるすべての 1D 配列をループしgrid、内側のforループはこれらの内側の 1D 配列のそれぞれにランダムな値を入力します。

ああ、最後にもう 1 つ。合計を計算すると、最も内側のループで が得られsum += grid[j][i]ます。iおそらく、配列インデックスになり、 index で配列の要素インデックスになりたいと思うjでしょう。igrid[i][j]

また、配列に書き込みを行っていない場合 (例: 出力や合計の検索) は、Java の拡張forループを使用することもできます。

int sum = 0;

for (int[] row : grid)
    for (int n : row)
        sum += n;

やや冗長で、おそらくより読みやすくなっています。

于 2013-09-17T01:07:39.827 に答える