通过对角倾斜遍历具有左倾斜对角线截面的2D数组来获取数组列表?

时间:2019-02-16 16:41:33

标签: java arrays multidimensional-array iteration

我知道我可以使用for (int i = 0; i < myArray.length; i++)或增强的for循环来完全遍历循环。

但是,我试图通过对角线遍历一个矩形2D数组来创建新的char []数组,同时获取向左倾斜的部分(而不是通常的向右倾斜的部分)。

换句话说,请看下面的图片。我希望每个char []数组都由下图中两条红色对角线之间的所有字符组成。

enter image description here

因此,如果迭代从右上角开始,则创建的第一个数组为['q'],第二个数组为['e', 'w'],第三个数组为['d', 'j', 'e']等。< / p>

以下是图表代码:

private static char[][] bigArray = {
        {'a', 'b', 'c', 'd', 'e', 'q'},
        {'f', 'g', 'h', 'i', 'j', 'w'},
        {'k', 'l', 'm', 'n', 'o', 'e'},
        {'p', 'q', 'r', 's', 't', 'r'},
        {'u', 'v', 'w', 'x', 'z', 't'}};

尝试迭代向左倾斜的对角线使得很难始终知道我正在使用的数组的长度。特别是由于我创建的新char []数组的长度将不同。

是否有一种方法可以告诉java在我创建的每个数组中以特定长度停止迭代?

1 个答案:

答案 0 :(得分:1)

  

尝试迭代向左倾斜的对角线使得很难始终知道我正在使用的数组的长度。特别是由于我创建的新char []数组的长度将不同。

计算对角线的长度(新的char[]的大小),请根据您在矩阵bigArray(具有索引i和{ {1}})做到这一点

j

实施(以下说明)

int newCharArrayLength = Math.min(height - i, width - j);

一个private static List<char[]> getDiagonalsList(char[][] arr) { List<char[]> ans = new ArrayList<>(); int height = arr.length; int width = arr[0].length; int numberOfDiagonals = arr.length + arr[0].length - 1; for (int diagonalIdx = 0; diagonalIdx < numberOfDiagonals; diagonalIdx++) { int i = Math.max(diagonalIdx - width + 1, 0); int j = Math.max(width - diagonalIdx - 1, 0); int currentDiagonalLength = Math.min(height - i, width - j); int idx = 0; char[] charArr = new char[currentDiagonalLength]; while (i < height && j < width) charArr[idx++] = arr[i++][j++]; ans.add(charArr); } return ans; } 函数

您可以编写一个main函数来输出结果

main

输出

结果将如下所示

public static void main(String[] args) {
    char[][] arr = {
            {'a', 'b', 'c', 'd', 'e', 'q'},
            {'f', 'g', 'h', 'i', 'j', 'w'},
            {'k', 'l', 'm', 'n', 'o', 'e'},
            {'p', 'q', 'r', 's', 't', 'r'},
            {'u', 'v', 'w', 'x', 'z', 't'}};

    for (char[] diag : diagonal(arr))
        System.out.println(diag);
}

说明和算法

  1. 初始化q ew dje cior bhntt agmsz flrx kqw pv u 中的List。这是您在每次迭代中放置对角线的地方
  2. 计算矩形的总char[]。您可以将宽度和高度相加减去一个(重复的角)
  3. 计算您的numberOfDiagonals索引。这可以通过从对角线索引中减去矩形的宽度减去一来完成(因为我们从0开始索引)。该指数应始终为正
  4. 计算您的i索引。与以前相同的原理,但您要减去减法,因为我们要反转对角线。这也必须是积极的
  5. 计算您的j。为此,更小,是当前行currentDiagonalLength 与高度或当前列(i) 距离>和宽度
  6. 初始化一个数组,该数组将使您的对角线具有先前计算的长度
  7. 一个接一个地添加项目。在每次迭代时,您的当前行(j) 当前列i
  8. 将该数组追加到步骤1
  9. 中提到的列表中
  10. 重复步骤3 步骤8 ,直到完成所有对角线