1. 概述

在本教程中,我们将学习如何斜向遍历一个二维数组。该方法适用于任意尺寸的二维方阵(即行数和列数相等的数组)。

2. 二维数组结构

二维数组通过行索引列索引来访问其中的元素。在本例中,我们通过如下示意图来理解如何获取每个元素:

LoopingDiagonallyThrough2DArray 2

从图中可以看出,二维数组的元素是按照对角线方向排列的。我们需要先确定数组中有多少条对角线(diagonal lines)。

对于一个 n x n 的二维数组来说:

int length = twoDArray.length;
int diagonalLines = (length + length) - 1; // 总共 diagonalLines 条对角线
int midPoint = (diagonalLines / 2) + 1;    // 找到中间点,用于分段处理

✅ 举个例子:对于一个 3x3 的数组,总共有 5 条对角线,中点是 3

3. 获取行与列索引

我们通过一个循环来遍历每一条对角线:

for (int i = 1; i <= diagonalLines; i++) {
    // 根据 i 的值判断当前对角线上的元素个数
}

3.1 每条对角线上的元素个数

定义一个变量 itemsInDiagonal,表示当前对角线上元素的个数:

  • i <= midPoint 时,itemsInDiagonal 递增
  • 否则递减
int itemsInDiagonal = 0;

if (i <= midPoint) {
    itemsInDiagonal++;
} else {
    itemsInDiagonal--;
}

3.2 遍历当前对角线上的所有元素

再嵌套一个内层循环,变量 j0itemsInDiagonal - 1

for (int j = 0; j < itemsInDiagonal; j++) {
    int rowIndex;
    int columnIndex;
    
    if (i <= midPoint) {
        rowIndex = (i - j) - 1;
        columnIndex = j;
    } else {
        rowIndex = (length - 1) - j;
        columnIndex = (i - length) + j;
    }

    // 访问数组元素:twoDArray[rowIndex][columnIndex]
}

3.3 示例说明

以如下 3x3 的数组为例:

char[][] twoDArray = {
    {'a', 'b', 'c'},
    {'d', 'e', 'f'},
    {'g', 'h', 'i'}
};

遍历顺序为:

a
b d
c e g
f h
i

⚠️ 注意:这里的顺序是按对角线从左上到右下依次遍历。

4. 总结

我们通过计算对角线条数和中点,结合内外两层循环,实现了对二维数组的斜向遍历。核心在于:

  • ✅ 理解对角线数量和中点的计算方式
  • ✅ 掌握不同阶段(前半段/后半段)的索引计算逻辑
  • ✅ 注意索引边界,避免越界异常

完整源码已托管在 GitHub:查看完整示例

如果你在实际项目中遇到类似需求(如图像处理、矩阵运算等),这套逻辑可以直接复用。


原始标题:Looping Diagonally Through a 2d Java Array | Baeldung