【问题标题】:Obtaining a list of arrays by diagonally traversing a 2D array with left-leaning diagonal sections?通过对角线遍历具有左倾对角线部分的二维数组来获取数组列表?
【发布时间】:2019-07-10 12:59:30
【问题描述】:

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

但是,我试图通过对角线完全迭代矩形二维数组来创建新的 char[] 数组,同时采用左倾部分(而不是通常的右倾部分)。

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

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

这是图表代码:

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 停止为我创建的每个数组以特定长度迭代?

【问题讨论】:

  • 您可以添加一些代码或图表吗?我不确定我是否理解这里的问题,尤其是 左/右倾斜部分
  • @molamk 我已经添加了图表。如果您需要更多说明,请告诉我。
  • 你能添加图中的代码吗?
  • @driftking9987 我已经添加了。

标签: java arrays multidimensional-array iteration


【解决方案1】:

尝试迭代左倾对角线会导致很难始终知道我正在使用的数组的长度。特别是因为我创建的新 char[] 数组的长度不同。

计算对角线的长度(您的新char[] 的大小)根据您在矩阵bigArray 中的当前位置(使用索引ij)执行此操作

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

输出

结果将如下所示

q
ew
dje
cior
bhntt
agmsz
flrx
kqw
pv
u

解释与算法

  1. 初始化Listchar[]。这是您在每次迭代中放置对角线的地方
  2. 计算矩形的总numberOfDiagonals。您可以将宽度和高度相加减一(重复角)
  3. 计算您的i 索引。这可以通过从对角线索引中减去矩形宽度减一来完成(因为我们从 0 开始索引)。该指数应始终为正数
  4. 计算您的j 索引。与以前的原理相同,但您反转减法,因为我们需要反向对角线。这也需要是积极的
  5. 计算您的currentDiagonalLength。要做到这一点,较小当前行(i) 和高度之间的距离或当前列(j) 和宽度
  6. 初始化一个数组,用之前计算的长度保存对角线
  7. 逐一添加项目。在每次迭代中增加您的当前行i当前列j
  8. 将该数组附加到步骤 1 中提到的列表中
  9. 重复步骤 3步骤 8,直到完成所有对角线

【讨论】:

    猜你喜欢
    • 2019-07-09
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多