-7

2D 배열 (Cell[][] 격자)을 만들고 각 셀에 neighborCells이라는 ArrayList; 그리고 지금 나는 그 이웃 세포를 찾으려고 노력하고있다. 그러나 나는 IndexOutOfBoundsException를 얻고있다. 도울 수 있니?2D 배열에서 이웃 셀을 찾고 IndexOutOfBounds 가져 오기

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  
      } 
     } 
    } 
} 
+0

ArrayList 정의 방법은 무엇입니까? .NET 클래스 또는 자바 클래스입니까? – Wolf

+0

자바 클래스 – flower

+0

네, 답변을 망쳐 버려서 죄송합니다. 너는 그것을 다시 편집했다. 나는 지금 그것이 정확하지 않다고 생각한다. 'neighborCells'는 당신이 얻고 자하는 이웃들의 모임이 아닌가요? – Wolf

답변

3

제가 발견 [1]세 에러하여 예의 다음 수정 제안 :

1) 단부 위치의 계산 - 변경 하여 예외 발생 -이

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

2) 각 셀에 대해 arraylist가 필요하므로 결과를 처음 두 줄로 변경하고 c

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

3) 셀이 자신의 이웃

if (row!=i || col!=j) { 
    grid[i][j].neighborCells.add(grid[row][col]); 
} 
아니다에 hange

[1]에서 왼쪽 실수가있는 경우 나, ++ C로 미안를 포팅)

+0

에 대한 2) 내가 이웃 세포에 개인 액세스를 가지고있어 – flower

+0

@ 플라워 다시 오신 것을 환영합니다! 저는 개발자로서 당신이'Cell' 클래스의 정의에 대한 쓰기 권한을 가지고 있다고 생각합니다 : * 하나 * (빠른) 옵션은 멤버 정의 앞에'public'을 추가하는 것입니다. – Wolf

+0

예 Cell 클래스에 대한 쓰기 권한이 있습니다. 하지만 그것은 이미 public class Cell이며 내부에 private ArrayList가 있습니다 neighborCells; – flower

0

다음은 귀하가 제공하지 않은 테스트 Cell 클래스에 사용 된 것입니다.

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

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

    private List<Cell> list; 
} 

다음은 인접 셀을 찾을 수있는 예입니다. 왜 네 개의 인접 셀 (위, 아래, 왼쪽 및 오른쪽) 밖에있을 수없는 경우 두 개의 중첩 된 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]); 
    } 
}