18x18电路板阵列索引超出界限

时间:2015-04-23 02:16:07

标签: java arrays unix

// 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个块中查找所有真正的邻居值时,获取数组超出范围异常。

我认为代码已经处理过了,因为我认为这些值无论如何都是假的。

1 个答案:

答案 0 :(得分:0)

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

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;
}

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

{{1}}

此外:

  • 没有必要检查网格单元是否为空,如果是,则加零以计数,因为这不会对计数产生任何影响。
  • 你不需要测试if(some_boolean == true),你可以写if(some_boolean)
  • 您的循环终止条件应为> = -1而不是> -1,如果你打算包括-1。