Java 尝试在2D数组中查找相邻单元格并获取IndexOutOfBounds

Java 尝试在2D数组中查找相邻单元格并获取IndexOutOfBounds,java,arrays,multidimensional-array,indexoutofboundsexception,neighbours,Java,Arrays,Multidimensional Array,Indexoutofboundsexception,Neighbours,我创建了一个二维数组(一个Cell[][]grid),每个单元格都包含一个名为neighborCells的ArrayList;现在我正试图找到它的邻近细胞,但我得到了索引outofboundsexception。你能帮忙吗 ArrayList<Cell> neighborCells = new ArrayList(); for(int i = 0; i < grid.length; i++){ for(int j = 0; j < grid.length; j++

我创建了一个二维数组(一个
Cell[][]
grid),每个单元格都包含一个名为
neighborCells
ArrayList
;现在我正试图找到它的邻近细胞,但我得到了
索引outofboundsexception
。你能帮忙吗

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    
            }
        }   
    }
}
ArrayList neighborCells=new ArrayList();
对于(int i=0;i网格长度)?i:i+1;
int-endPositionY=(j+1>网格长度)?j:j+1;
对于(int row=startPositionX;row我在您的示例中发现[1]三个错误,并建议以下更正:

1) 将导致异常的末端位置的计算更改为

int endPositionX =   (i + 1 >= grid.length) ? i : i + 1;
int endPositionY =  (j + 1 >= grid.length) ? j : j + 1;
2) 每个单元格都需要一个arraylist,因此将结果的初始创建更改为两行,并将其更改为

grid[i][j].neighborCells = new ArrayList();
3) 细胞不是它自己的邻居

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


(1)我把它移植到C++,如果有错误,请把它移植回去,抱歉)

这是我用过的测试单元类,因为你没有提供你的

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

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

    private List<Cell> list;
}
公共类单元格{
公共单元格(){
list=newarraylist();
}
公共空白添加(单元格){
列表。添加(单元格);
}
私人名单;
}
这里有一个例子可以找到相邻的单元格。我不知道如果只有4个相邻单元格(上、下、左、右),为什么还要有两个嵌套的for循环。对我来说,去掉它们似乎更简单

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] );
    }
}
Cell[][]网格=新单元格[5][5];
对于(int i=0;i0)单元格[i][j],则添加(单元格[i-1][j]);
//左边的牢房
如果(j>0)单元格[i][j],则添加(单元格[i][j-1]);
//下面的单元格
如果(i
ArrayList是如何定义的?是.NET类还是Java类?好的,很抱歉弄乱了你的答案。你再次编辑了它。我认为它现在不正确。
neighborCells
不是你想要得到的邻居集合吗?是的,neighborCells是包含网格邻居的ArrayList。每个网格[I][j]在我的邻居的列表中。同时我的第一个答案被删除了。请检查新的是否可以接受。我尝试C++中的代码,它做了它应该做的。但是,它对我来说不起作用。我做了下面你推荐的,我得到错误的SnReNoCyle在细胞中有私有访问。(在您建议的第二个更改中。)
公共类单元格
内部有一个
私有ArrayList neighborCells;
Cell@flower欢迎回来!我认为作为一名开发人员,您对
单元的定义有写访问权
类:一(快速)选项是在成员定义之前添加
public
。是的,我有对Cell类的写入权限。但它已经是public类Cell,并且在它内部有一个我期望的私有ArrayList neighborCells。请尝试(1)将其更改为
public ArrayList neighborCells;
或(2)添加一个
public void addneighborcell(Cell Cell)
函数。遗憾的是,我不能推荐一个好的Java初学者教程(我不是Java程序员),但我想你需要它。(请注意:第一个选项被认为是“糟糕的风格”)