为了账号安全,请及时绑定邮箱和手机立即绑定

通过对角线遍历具有左倾对角线部分的二维数组来获取数组列表?

通过对角线遍历具有左倾对角线部分的二维数组来获取数组列表?

桃花长相依 2022-06-23 17:42:41
我知道我可以使用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 停止为我创建的每个数组以特定长度迭代?
查看完整描述

1 回答

?
达令说

TA贡献1821条经验 获得超6个赞

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


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


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指数。这可以通过从对角线索引减去 1 减去矩形的宽度来完成(因为我们从 0 开始索引)。该指数应始终为正

  4. 计算你的j指数。与以前的原理相同,但您反转减法,因为我们需要反向对角线。这也需要积极

  5. 计算你的currentDiagonalLength. 要做到这一点更小当前行和高度或当前列和宽度之间的距离(i)(j)

  6. 初始化一个数组,该数组将使用先前计算的长度保存您的对角线

  7. 一项一项地添加项目。在每次迭代中增加当前行i当前列j

  8. 将该数组附加到步骤 1中提到的列表中

  9. 重复步骤 3步骤 8,直到完成所有对角线


查看完整回答
反对 回复 2022-06-23
  • 1 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信