我有一个任意大小的大数组。这是一个方阵。我试图掌握如何沿着对角线遍历它/
而不是\
(我已经知道该怎么做)。到目前为止,我有以下代码:
char[][] array = new char[500][500];
//array full of random letters
String arrayLine = "";
for (int y = 0; y < array.length; y++) {
for (int x = 0; x < array.length; x++) {
for (???) {
arrayLine = arrayLine + array[???][???];
}
}
System.out.println(arrayLine);
}
我有三个循环,因为这是我做另一个对角线的方式:
for (int y = 0; y < array.length; y++) {
for (int x = 0; x < array.length; x++) {
for (int z = 0; z < array.length-y-x; z++) {
arrayLine = arrayLine + array[y+z][x+z];
}
}
System.out.println(arrayLine);
}
在我的尝试中,我不断超越边界并获得ElementOutOfBounds异常。假设数组如下(3x3而不是500x500):
A B C
D E F
G H I
我想将以下字符串打印出来:
A
BD
CEG
FH
I
之前的SO问题与整数数组有类似的问题,解决方案基于数组元素的总和。但是我正在使用字符,所以我想不出一种方法来实现它。
答案 0 :(得分:11)
考虑细胞的坐标:
. 0 1 2
0 A B C
1 D E F
2 G H I
对于任何对角线,所有元素都有一些共同点:元素坐标的总和是常数。以下是常量:
0 = 0+0 (A)
1 = 1+0 (B) = 0+1 (D)
2 = 2+0 (C) = 1+1 (E) = 0+2 (G)
3 = 2+1 (F) = 1+2 (H)
4 = 2+2 (I)
最小常数是最小坐标和,0。最大常数是最大坐标和。由于每个坐标组件最多可达array.length - 1
,因此最大常量为2 * (array.length - 1)
。
所以要做的就是迭代常量。对于每个常量,迭代其坐标总和为常量的元素。这可能是最简单的方法:
for (int k = 0; k <= 2 * (array.length - 1); ++k) {
for (int y = 0; y < array.length; ++y) {
int x = k - y;
if (x < 0 || x >= array.length) {
// Coordinates are out of bounds; skip.
} else {
System.out.print(array[y][x]);
}
}
System.out.println();
}
然而,这将最终迭代许多越界坐标,因为它总是迭代所有可能的y
坐标,即使只有一个对角线包含所有可能的y
坐标。让我们更改y
循环,使其仅访问当前y
所需的k
坐标。
越界坐标的一个条件是x < 0
。替换x
的定义并解决:
x < 0
k - y < 0
k < y
y > k
因此,当y > k
时,x
将为负数。因此,我们只想在y <= k
时循环。
越界坐标的另一个条件是x >= array.length
。解决:
x >= array.length
k - y >= array.length
k - array.length >= y
y <= k - array.length
因此,当y <= k - array.length
时,x
会过大。因此,我们希望将y
设置为0或k - array.length + 1
,以较大者为准。
for (int k = 0; k <= 2 * (array.length - 1); ++k) {
int yMin = Math.max(0, k - array.length + 1);
int yMax = Math.min(array.length - 1, k);
for (int y = yMin; y <= yMax; ++y) {
int x = k - y;
System.out.print(array[y][x]);
}
System.out.println();
}
注意:我只证明此代码正确无误。我还没有测试过。
答案 1 :(得分:0)
更简单的方法是检查索引是否等于array.length = 1;对于diagonalRight和diagonalLeft,只需检查我是否等于j
示例:
digonalLeft sums of of matrix,因为(0,0)(1,1)(2,2)成为对角线。 diagonalRight sums / of matrix,因为(0 + 2)=(1 + 1)=(2 + 0)= 2而2是array.length - 1.
long diagonalLeft = 0;
long diagonalRight = 0;
for (int i = 0; i < array.lenth - 1; i++) {
for (int j = 0; j < array.length -1; j++) {
if (i == j) digonalLeft += array[i][j];
if (i + j == array.length - 1) diagonalRight += array[i][j];
}
}