Java和遍历循环

时间:2018-01-06 00:03:25

标签: java arrays traversal

这个问题与我之前关于如何遍历多维数组的文章有些相关。

编辑:我添加了三张关于如何重新排列多维数据集的图像。第一张图显示了一个2x2x2的多维数据集,其数字设置在默认位置。第二个图像显示相同的立方体,第一列逆时针旋转。第三张图显示Z,X和Y轴。

Default cube with the default setup of integers The rearranged values of the Y column at position 0 Cube's Z, X and Y values are displayed

编辑2:我改变了价值观。 编辑1:基于笔和纸的估计,我有以下循环迭代。在这种情况下,它将是上面立方体中的数字0,2,4和6。这些是应从中获取数字的Z,X和Y值:

z  x  y
0  0  0
0  1  0
1  0  0
1  1  0

编辑2:我已经更改了值,用zz替换了旧的z,用xx替换了旧的x。这是必需的,因为一方(容器)必须使用z值,而另一方(containerTemp)需要zz值(反向的z值)。 编辑1:数字0,2,4和6应放在以下位置,就像从上述位置取得一样:

zz xx  y
 1  0  0
 0  0  0
 1  1  0
 0  1  0

编辑2:这意味着位置0 0 0(z x y)的值0将移动到位置1 0 0(zz xx y)的值4的位置。

注意:据我所知,这通常不是如何在3D矩阵中使用Z,X和Y位置,也许这​​就是为什么找到解决这个问题的难度。我为每个切片的立方体完成了旋转和翻转,所以我觉得我不应该改变代码的工作方式(当然,如果我认为像白痴,我会对WOW建议开放)。我只是想在矩阵操作方面做得更好,因为即使在我的职业生涯中,我也从不和这种东西坐在一起。

解决:我在我的项目中使用了以下代码。但是,该代码不适用于2x3x2分组。所以我想这个解决方案应该只用于大小相同的立方体。我会调查一下,但截至目前我的项目并不需要它。如果有人想知道更好的方式,请告诉我,因为我想了解更多!

for (int y = 0; y < yDim; y++) {
    for (int z = 0; z < zDim; z++) {
        for (int x = 0, zz = xDim - 1, xx = z; x < xDim; x++, zz--) {
            System.out.println("["+zz+"]["+xx+"]["+y+"] = ["+z+"]["+x+"]["+y+"]");
            containerTemp[zz][xx][y] = container[z][x][y];
        }
    }
}

1 个答案:

答案 0 :(得分:0)

想一想 - 每次你翻转魔方时,你都会转动一片的立方体,这实际上是一个二维数组你知道怎么解决。

所以每回合你都需要:

  1. 实现 你需要的正确的二维数组(我想它将使用xyz的固定值给出例如 - y=2将在x上定义z的二维数组,其中所有y值均为2
  2. 在其上应用您已经
  3. 的算法
  4. 将结果复制到原始的三维数组。
  5. 因此对于y=2的情况,它将类似于(伪代码):

    // defining the two-dimensional array (the "slice") from the cube-array
    for (i = 0; i < N; i++) {
        for (k = 0; k < N; k++) {
            arr[i,k] = origArr[i,2,k]
        }
    }
    
    // turning the two-dimensional array with the function we already have
    turnedArr = turn(arr)
    
    // copying the resulted two-dimensional array back to the cube
    for (i = 0; i < N; i++) {
        for (k = 0; k < N; k++) {
            origArr[i,2,k] = turnedArr[i,k]
        }
    }
    

    当然,您必须注意每个轴的索引开始迭代的位置以及您是否增加或减少等,但这是主要想法