Java - 从中​​间开始迭代二维数组

时间:2016-01-01 13:05:13

标签: java arrays

我在二维数组上有这个完全正常的循环。

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.

我花了好几个小时寻找有效的方法并在互联网上找到解决方案,但我还没有找到一个好的答案。谁知道怎么做?

2 个答案:

答案 0 :(得分:5)

这还没有给你任何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]

清楚可见的是&#34;蜗牛&#34;图案。您始终填充先前填充的单元格的外部邻居单元格。

忽略第一次迭代填充的字段的外边界

  

1个细胞 - 然后是   4个细胞
  8个细胞
  12个细胞
  ...... +4个细胞

就循环而言,你不应该使用(i,j)循环,它们都反映了数组中的索引。而是循环遍历round,然后在该特定回合中打印相应的单元格。在第X轮中,您从字段arrayLength / 2 - X开始。

答案 1 :(得分:1)

基本的looop如下 -

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)元素