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

相邻单元格的定义
通常我们说的二维数组相邻单元格,指的是与指定单元格上下左右直接相连的元素,也就是四邻域的情况。如果需要包含对角线方向的单元格,就是八邻域的情况。下面以四邻域为例展开说明,八邻域的实现逻辑类似,只需要增加对应的偏移量即可。
四邻域偏移量
假设当前单元格的坐标是(row, col),那么四个相邻单元格的坐标偏移量分别是:
- 上方:
(row-1, col) - 下方:
(row+1, col) - 左方:
(row, col-1) - 右方:
(row, col+1)
边界校验的核心逻辑
要避免越界异常,核心是在访问数组元素之前,先判断计算出的相邻坐标是否在二维数组的有效范围内。二维数组的有效行索引范围是0到rows-1,有效列索引范围是0到cols-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)本身是否在二维数组的有效范围内,避免目标坐标越界的情况。 - 如果二维数组不是标准的矩形数组(比如每行的列数不同),需要先处理这种情况,或者根据实际业务规则调整列数的获取逻辑。
- 如果二维数组的元素类型不是基本类型,而是自定义对象,获取相邻单元格的逻辑和上述示例一致,只需要调整返回值的类型即可。