2015-04-23 55 views
0
// Counts the neighbors of alive or dead cells in boolean grid. 
    public static int countNeighbors (final boolean[][] grid, final int row, final int col) { 
     // Finds neighbors in top row. 
     int count = 0; 
     for (int i = 1; i > -1; --i) { 
      if (grid[row - 1][col + i] == true) 
       count += 1; 
      else if (grid[row - 1][col + i] == false) 
       count += 0; 
     } 

     // Finds neighbors in same row. 
     for (int i = 1; i > -1; --i) { 
      if (grid[row][col + i] == true) 
       count += 1; 
      else if (grid[row][col + i] == false) 
       count += 0; 
     } 

     // Finds neighbors in bottom row. 
     for (int i = 1; i > -1; --i) { 
      if (grid[row + 1][col + i] == true) 
       count += 1; 
      else if (grid[row + 1][col + i] == false) 
       count += 0; 
     } 

     return count; 
    } 

当我试图在指定的正方形周围的所有8个块中查找所有真正的邻居值时,获取数组越界。18x18板阵列索引出界

我觉得代码已经可以处理,如果它超出了界限,因为我认为这些值将是错误的。

+0

你的问题是什么?在访问数组之前,只需检查行和列是否在范围内。 – samgak

+0

此代码充满了问题。只是第一个'if'语句('if(grid [row - 1] [col + i] == true)')将导致越界异常。 –

+0

Java数组是基于零的。 –

回答

0

创建一个单独的函数来获取网格单元,包括边界检查:

public static boolean getGridCell (final boolean[][] grid, final int row, final int col) 
{ 
    // bounds check: 
    if((row < 0) || (row >= grid.length)) 
     return false; 
    if((col < 0) || (col >= grid[row].length)) 
     return false; 

    return grid[row][col]; 
} 

然后调用这个函数,而不是直接访问网格:

public static int countNeighbors (final boolean[][] grid, final int row, final int col) { 
    // Finds neighbors in top row. 
    int count = 0; 
    for (int i = 1; i >= -1; --i) { 
     if (getGridCell(grid, row - 1,col + i)) 
      count += 1; 
    } 

    // Finds neighbors in same row. 
    for (int i = 1; i >= -1; --i) { 
     if (getGridCell(grid, row, col + i)) 
      count += 1; 
    } 

    // Finds neighbors in bottom row. 
    for (int i = 1; i >= -1; --i) { 
     if (getGridCell(grid, row + 1, col + i)) 
      count += 1; 
    } 

    return count; 
} 

另外:

  • 没有必要检查网格单元是否为空,并且如果它是零,则计数,因为这不会产生任何差异对伯爵的看法。你不需要测试if(some_boolean == true),你可以直接写if(some_boolean)
  • 你的循环终止条件应该是> = -1 not> -1,如果你打算包括-1 。