Java - 从中间开始迭代遍历一个二维数组

4
我有一个完全正常的循环遍历二维数组。
for(int i = 0; i<array.length; i++){
    for(int j = 0; i<array.length; j++){
        array[i][j].doSomething();
    }
}

我想要遍历这个二维数组,从中间开始。例如,如果该数组在两个维度上的长度均为100,则我希望按照以下方式遍历它:
array[50][50] //middle of array
array[49][50] //x-1
array[50][49] //y-1
array[51][50] //x+1
array[50][51] //y+1
array[48][50] //x-2
array[49][49] //x-1 and y-1
array[50][48] //y-2
array[51][49] //x+1 and y-1
array[52][50] //x+2
array[51][51] //x+1 and y+1
array[50][52] //y+2
array[49][51] //x-1 and y+1
etc.

我已经花费数小时寻找一种高效的方法并在互联网上寻找解决方案,但我尚未找到一个很好的答案。有人知道如何做这个吗?


数组的大小是否为二次方? - luk2302
1
尝试使用大小为5或6的尺寸,在纸上绘制数组网格,然后在每个方框中写入其打印编号,在中心从0开始,并尝试找到数字模式 - 使用两个for循环将不会有任何进展。 - luk2302
已经完成了。我在问题评论中写的数字是它们在我的网格上的坐标。 - Simon Baars
2个回答

6

这不会立即给您任何Java代码,而是提供一个解决问题的思路。

在纸上绘制数组网格的远小于实际大小的图形,并在每个单元格中标注该单元格应达到的数字。

[ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ]
[ ][ ][1][ ][ ]
[ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ]

[ ][ ][ ][ ][ ]
[ ][ ][3][ ][ ]
[ ][2][1][4][ ]
[ ][ ][5][ ][ ]
[ ][ ][ ][ ][ ]

[ ][ ][8][ ][ ]
[ ][7][3][9][ ]
[6][2][1][4][A]
[ ][D][5][B][ ]
[ ][ ][C][ ][ ]

[ ][F][8][G][ ]
[E][7][3][9][H]
[6][2][1][4][A]
[L][D][5][B][I]
[ ][K][C][J][ ]

[M][F][8][G][N]
[E][7][3][9][H]
[6][2][1][4][A]
[L][D][5][B][I]
[P][K][C][J][O]

显然可以看到“蜗牛”模式。您总是填充先前填充单元格的外部邻居单元格。
忽略字段的外部范围,第一次迭代填充
1个单元格 - 然后 4个单元格 8个单元格 12个单元格 ... +4个单元格
在循环方面,不应使用反映数组中索引的(i,j)进行循环。而应该循环遍历rounds,然后打印该特定round中的相应单元格。在round X中,您从字段arrayLength / 2-X开始。

谢谢你的帮助。我会尝试编写一些代码 :)。 - Simon Baars

1
基本循环如下所示 -
K=1;
while(true) {
    k=K-1;
    for(n=0; n<=k; n++)
      x=-k+n; y=-n;       
    for(n=1; n<=k; n++)
      x=n; y=-k+n;        
    for(n=1; n<=k; n++)
      x=k-n; y=n;         
    for(n=1; n<=k-1; n++)
      x=-n; y=k-n;
    if x out of bounds or y out of bounds continue;
    K++;
    if(K>N/2) break;
}

其中N是数组的大小(宽度或高度),K是循环次数,当K=1时为中心。

要找到x y坐标,需要进行四个循环:左上、右上...... - 由于坐标系位于N/2,N/2处,因此必须将其添加到x y中。每个循环中有K+2(K-1)+(K-2)个元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接