-7

2D 配列 (Cell[][]グリッド) を作成し、各セルには;ArrayListという名前のが含まれています。neighborCellsそして今、私はその隣接セルを見つけようとしていますが、IndexOutOfBoundsException. 手伝ってくれますか?

ArrayList<Cell> neighborCells = new ArrayList();
for(int i = 0; i < grid.length; i++){
    for(int j = 0; j < grid.length; j++) { //we can also use grid.length since it is the same
        int startPositionX = (i - 1 < 0) ? i : i - 1;
        int startPositionY = (j - 1 < 0) ? j : j - 1;
        int endPositionX =   (i + 1 > grid.length) ? i : i + 1;
        int endPositionY =  (j + 1 > grid.length) ? j : j + 1;
        for (int row = startPositionX; row <= endPositionX; row++) { 
            for (int col = startPositionY; col <= endPositionY; col++) {
                neighborCells.add(grid[row][col]); // here is the error    
            }
        }   
    }
}
4

2 に答える 2

3

[1]あなたの例に 3 つのエラーが見つかりました。次の修正を提案します。

1)例外の原因となった終了位置の計算をこれに変更します

int endPositionX =   (i + 1 >= grid.length) ? i : i + 1;
int endPositionY =  (j + 1 >= grid.length) ? j : j + 1;

2)セルごとに配列リストが必要なので、結果の最初の作成を2行下に変更し、次のように変更します

grid[i][j].neighborCells = new ArrayList();

3) セルはそれ自身の隣人ではない

if (row!=i || col!=j) {
    grid[i][j].neighborCells.add(grid[row][col]);
}

[1] C++ に移植したので、移植後のミスがあれば申し訳ありません ;)

于 2014-06-06T09:36:23.900 に答える
1

あなたがあなたのものを提供しなかったので、これは私がテストCellクラスに使用したものです

public class Cell {
    public Cell( ) {
        list = new ArrayList<Cell>( );
    }

    public void add( Cell cell ) {
        list.add( cell );
    }

    private List<Cell> list;
}

そして、これは隣接するセルを見つける例です。隣接するセルが 4 つしかない場合 (上、下、左、右)、for ループがさらに 2 つ入れ子になっている理由がわかりません。それらを取り除くのは私には簡単に思えます

Cell[][] grid = new Cell[5][5];

for (int i = 0; i < grid.length; i++) {
    for (int j = 0; j < grid[i].length; j++) {
        cell[i][j] = new Cell( );
    }
}

for (int i = 0; i < grid.length; i++) {
    for (int j = 0; j < grid[i].length; j++) {
        // Cell above
        if (i > 0) cell[i][j].add( cell[i - 1][j] );

        // Cell to the left
        if (j > 0) cell[i][j].add( cell[i][j - 1] );

        // Cell below
        if (i < grid.length - 1) cell[i][j].add( cell[i + 1][j] );

        // Cell to the right
        if (j < grid[i].length - 1) cell[i][j].add( cell[i][j + 1] );
    }
}
于 2014-06-06T15:41:08.520 に答える