导读:本期聚焦于小伙伴创作的《如何安全获取二维数组中指定单元格的所有相邻单元格(避免越界异常)》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何安全获取二维数组中指定单元格的所有相邻单元格(避免越界异常)》有用,将其分享出去将是对创作者最好的鼓励。

在处理二维数组相关业务时,经常需要获取指定单元格的相邻单元格,比如游戏地图的周边探测、矩阵数据的邻域计算等场景。如果直接按照固定偏移量访问数组元素,很容易出现索引越界异常,导致程序崩溃。本文会介绍通用的相邻单元格获取思路,通过边界校验过滤无效索引,同时提供不同编程语言的实现示例,帮助开发者快速掌握安全获取相邻单元格的方法,避免越界问题。

如何安全获取二维数组中指定单元格的所有相邻单元格(避免越界异常)

相邻单元格的定义

通常我们说的二维数组相邻单元格,指的是与指定单元格上下左右直接相连的元素,也就是四邻域的情况。如果需要包含对角线方向的单元格,就是八邻域的情况。下面以四邻域为例展开说明,八邻域的实现逻辑类似,只需要增加对应的偏移量即可。

四邻域偏移量

假设当前单元格的坐标是(row, col),那么四个相邻单元格的坐标偏移量分别是:

  • 上方:(row-1, col)
  • 下方:(row+1, col)
  • 左方:(row, col-1)
  • 右方:(row, col+1)

边界校验的核心逻辑

要避免越界异常,核心是在访问数组元素之前,先判断计算出的相邻坐标是否在二维数组的有效范围内。二维数组的有效行索引范围是0rows-1,有效列索引范围是0cols-1,其中rows是二维数组的行数,cols是二维数组的列数。

校验规则可以总结为:如果相邻单元格的行索引大于等于0且小于总行数,同时列索引大于等于0且小于总列数,那么这个相邻单元格是有效的,可以加入结果集合。

Java实现示例

下面是Java语言中获取四邻域相邻单元格的完整实现,包含边界校验逻辑:

public class ArrayNeighborUtil {
    /**
     * 获取二维数组中指定坐标的四邻域相邻单元格
     * @param matrix 二维数组
     * @param row 目标单元格行索引
     * @param col 目标单元格列索引
     * @return 有效相邻单元格的坐标集合,每个元素是长度为2的数组,第一个元素是行索引,第二个是列索引
     */
    public static List<int[]> getFourNeighbors(int[][] matrix, int row, int col) {
        List<int[]> result = new ArrayList<>();
        if (matrix == null || matrix.length == 0) {
            return result;
        }
        int rows = matrix.length;
        int cols = matrix[0].length;
        // 定义四邻域的偏移量
        int[][] offsets = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        for (int[] offset : offsets) {
            int newRow = row + offset[0];
            int newCol = col + offset[1];
            // 边界校验
            if (newRow >= 0 && newRow < rows && newCol >= 0 && newCol < cols) {
                result.add(new int[]{newRow, newCol});
            }
        }
        return result;
    }

    public static void main(String[] args) {
        int[][] testMatrix = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
        };
        // 获取坐标为(1,1)的单元格的相邻单元格
        List<int[]> neighbors = getFourNeighbors(testMatrix, 1, 1);
        System.out.println("相邻单元格坐标:");
        for (int[] neighbor : neighbors) {
            System.out.println("(" + neighbor[0] + ", " + neighbor[1] + ")");
        }
    }
}

Python实现示例

Python中二维数组通常用列表的列表表示,下面是对应的实现代码:

def get_four_neighbors(matrix, row, col):
    """
    获取二维数组中指定坐标的四邻域相邻单元格
    :param matrix: 二维数组,类型为list of list
    :param row: 目标单元格行索引
    :param col: 目标单元格列索引
    :return: 有效相邻单元格的坐标列表,每个元素是(row, col)的元组
    """
    if not matrix or not matrix[0]:
        return []
    rows = len(matrix)
    cols = len(matrix[0])
    # 四邻域偏移量
    offsets = [(-1, 0), (1, 0), (0, -1), (0, 1)]
    result = []
    for offset in offsets:
        new_row = row + offset[0]
        new_col = col + offset[1]
        # 边界校验
        if 0 <= new_row < rows and 0 <= new_col < cols:
            result.append((new_row, new_col))
    return result

if __name__ == "__main__":
    test_matrix = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
    ]
    neighbors = get_four_neighbors(test_matrix, 1, 1)
    print("相邻单元格坐标:")
    for neighbor in neighbors:
        print(neighbor)

八邻域扩展实现

如果需要获取八邻域的相邻单元格,只需要在偏移量集合中增加四个对角线的偏移量即可,Java版本的偏移量可以修改为:

// 八邻域偏移量,包含上下左右和四个对角线方向
int[][] offsets = {
    {-1, 0}, {1, 0}, {0, -1}, {0, 1},
    {-1, -1}, {-1, 1}, {1, -1}, {1, 1}
};

边界校验的逻辑不需要修改,因为越界的相邻坐标会被自动过滤掉。

注意事项

  • 在获取相邻单元格之前,一定要先校验传入的目标坐标(row, col)本身是否在二维数组的有效范围内,避免目标坐标越界的情况。
  • 如果二维数组不是标准的矩形数组(比如每行的列数不同),需要先处理这种情况,或者根据实际业务规则调整列数的获取逻辑。
  • 如果二维数组的元素类型不是基本类型,而是自定义对象,获取相邻单元格的逻辑和上述示例一致,只需要调整返回值的类型即可。

二维数组相邻单元格越界异常边界校验修改时间:2026-07-21 08:15:12

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。