我知道我可以使用for (int i = 0; i < myArray.length; i++)
或增强的for循环来完全遍历循环。
但是,我试图通过对角线遍历一个矩形2D数组来创建新的char []数组,同时获取向左倾斜的部分(而不是通常的向右倾斜的部分)。
换句话说,请看下面的图片。我希望每个char []数组都由下图中两条红色对角线之间的所有字符组成。
因此,如果迭代从右上角开始,则创建的第一个数组为['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在我创建的每个数组中以特定长度停止迭代?
答案 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);
}
q
ew
dje
cior
bhntt
agmsz
flrx
kqw
pv
u
中的List
。这是您在每次迭代中放置对角线的地方char[]
。您可以将宽度和高度相加减去一个(重复的角)numberOfDiagonals
索引。这可以通过从对角线索引中减去矩形的宽度减去一来完成(因为我们从0开始索引)。该指数应始终为正i
索引。与以前相同的原理,但您要减去减法,因为我们要反转对角线。这也必须是积极的j
。为此,更小,是当前行currentDiagonalLength
与高度或当前列(i)
距离>和宽度 (j)
和当前列i