java - 通过对角线遍历具有左倾对角线部分的二维数组来获取数组列表?
问题描述
我知道我可以使用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 停止为我创建的每个数组以特定长度迭代?
解决方案
尝试迭代左倾对角线使得很难始终知道我正在使用的数组的长度。特别是因为我创建的新 char[] 数组的长度不同。
要根据您在矩阵中的当前位置(使用索引和)计算对角线的长度(新的大小),请执行此操作char[]
bigArray
i
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);
}
输出
结果将如下所示
q
ew
dje
cior
bhntt
agmsz
flrx
kqw
pv
u
解释和算法
- 初始化一个
List
。char[]
这是您在每次迭代中放置对角线的地方 - 计算
numberOfDiagonals
矩形的总数。您可以通过将宽度和高度相加减一(重复角)来做到这一点 - 计算你的
i
指数。这可以通过从对角线索引减去 1 减去矩形的宽度来完成(因为我们从 0 开始索引)。该指数应始终为正 - 计算你的
j
指数。与以前的原理相同,但您反转减法,因为我们需要反向对角线。这也需要积极 - 计算你的
currentDiagonalLength
. 要做到这一点更小,当前行和高度或当前列和宽度之间的距离(i)
(j)
- 初始化一个数组,该数组将使用先前计算的长度保存您的对角线
- 一项一项地添加项目。在每次迭代中增加当前行
i
和当前列j
- 将该数组附加到步骤 1中提到的列表中
- 重复步骤 3到步骤 8,直到完成所有对角线
推荐阅读
- javascript - 如何防止我的网站在其他网站的 iframe 中打开?
- javascript - 播放按钮到暂停按钮
- bioinformatics - 如何从已识别的基序中获取基因(使用 HOMER 后)?
- windows - 如何请求 Windows 防火墙的 Windows 安全警报?
- python - 使用python Selenium循环遍历span元素的问题
- .net - .NET WebClient .DownloadFileAsync 和 .DownloadFile 什么都不做,也不抛出异常
- c++ - 错误:调用类 'std::__1::__wrap_iter 的私有构造函数
' - android - 2021年如何在kotlin中上传多个文件(webview)?
- java - 通知在时间选择器中未选择的时间关闭
- mysql - 如何正确使用mysql DISTINCT?