3

Ken Ken パズルを作成しようとするプロジェクトを開始しました。Ken Ken が何かわからない場合は、行または列に重複した整数値が存在しないという点で Sudoku に似ています。

新しい行ごとに作成された配列リストからの数値で 2D 配列を埋めようとしています。配列リストから取得した数値が、その行と列内の数値と一致しないかどうかを確認します。

コードを実行すると、リストから整数値を削除しようとすると、「Index Out Of Bounds」例外が発生します。正しい要素を取得していると思うので、なぜこれが起こっているのかわかりません。

これが私のコードです:

int GRID_SIZE = 4; int[][] grid = new int[GRID_SIZE][GRID_SIZE]; List<Integer> nums = new ArrayList<Integer>();

private void populateGrid() {

    for (int row = 0; row < GRID_SIZE; row ++) {

        // Creates an array of values from 1 to grid size.
        for (int i = 1; i <= GRID_SIZE; i++) nums.add(i);

        for (int col = 0; col < GRID_SIZE; col++) {

            while (nums.size() > 0) {

                // Gets a random number from the Array List
                int ranNum = nums.get(numGen.nextInt(GRID_SIZE));

                // Checks to see if the number is placeable.
                if (canPlace(ranNum, row, col)) {

                    // Places the number in the 2D Array
                    grid[row][col] = ranNum;
                    break;

                } else {

                    // Removes duplicate element from the Array List.
                    nums.remove(ranNum); <------{Index Out Of Bounds Exception]
                }
            }
        }
    } 
}

private boolean canPlace(int ranNum, int row, int col) {

    for (int i = 0; i < GRID_SIZE; i++) {

        // Checks if the specified number is already in the row/column.
        if (grid[col][i] == ranNum) return false;
        if (grid[i][row] == ranNum) return false;
    }

    return true;
}

これについていくつか質問があります。

まず、なぜ私はエラーが発生するのですか?

次に、グリッドに 2D 配列を使用するよりも優れたものと、数字を配置する方法はありますか?

最後に、ブレークを正しく使用していますか?

ご回答ありがとうございます。

4

4 に答える 4

2

これは、 APIIndexOutOFBoundsExceptionの障害 (IMO) が原因で発生します。呼び出したいメソッドと、実際に呼び出しているメソッドがありますList。後者は、指定されたインデックスの要素を削除しようとしますが、引数がおそらくリストのサイズよりも大きいため、そこにはありません。変数を または のいずれかにキャストして、正しいメソッドを確実に呼び出すことができます。remove(Object element)remove(int index)ranNumIntegerObject

于 2012-07-29T22:25:59.490 に答える
1
for (int i = 0; i <= GRID_SIZE; i++) nums.add(i);

これは私にはあまり意味がありません。0 ~ 4 の数字を追加しています。配列には最大 3 つのインデックスしかありません。0-1-2-3...

より多くのコードを実際に確認したり、インデックスが範囲外になっている場所を正確に把握したりしない限り、それは闇の中のショットです。

于 2012-07-29T22:28:05.283 に答える
1

問題への別のアプローチはどうですか?有効な正方形から始めて、それを変換します。「2 つの行を交換する」と「2 つの列を交換する」という 2 つの操作は、正方形のプロパティを保持します。これにより、2 つのフィッシャー イェーツシャッフルを行うことができます。1 つは行で、もう 1 つは列で、有効な正方形から開始する限り、有効なランダム化された正方形が得られます。最初の有効な正方形を構築するのは簡単です:

123456
234561
345612
456123
561234
612345
于 2012-07-30T14:45:34.990 に答える
0

コードをもう一度よく見てみると、主なエラーはcanPlace(int ranNum, int row, int col)メソッドに関係していることに気付きました。

私がしたことは、値値を交換するcolrowことだけで、うまくいきました。

ご協力ありがとうございました。

于 2012-07-30T04:57:13.867 に答える