Android java将2d数组分配给3d数组

时间:2011-01-01 23:43:02

标签: java android arrays multidimensional-array

我在尝试将二维数组分配给一个3d数组时遇到了问题,所以我想我会问一个关于3d和2d数组的问题。

假设我有一个masterArray [] [] []并希望将childArray1 [] []和childArray2 [] []放入其中。 这就是我如何做到这一点,并想知道这是否是正确的应用方式:

private int[][][] masterArray;
private int[][] childArray1 = {
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 0, 0, 1, 0, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 0, 1, 1, 1, 1, 1, 1, 0, 1},
        {1, 0, 1, 1, 1, 1, 0, 1, 0, 1},
        {1, 0, 1, 1, 0, 1, 0, 1, 0, 1},
        {1, 0, 1, 1, 0, 1, 1, 1, 0, 1},
        {1, 0, 1, 1, 1, 1, 1, 1, 0, 1},
        {1, 0, 1, 1, 0, 1, 1, 1, 0, 1},
        {1, 0, 1, 1, 0, 1, 8, 1, 0, 1},
        {1, 0, 7, 1, 1, 1, 0, 1, 0, 1},
        {1, 0, 1, 1, 1, 1, 0, 1, 0, 1},
        {1, 0, 1, 1, 1, 1, 1, 1, 0, 1},
        {1, 0, 0, 0, 0, 0, 0, 9, 0, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};
private int[][] childArray2 = {
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
        {1, 1, 1, 1, 7, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 0, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 0, 0, 0, 1, 1, 1},
        {1, 1, 1, 9, 1, 1, 8, 0, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
};

好的,所以在我的init方法中,我使用这些方法将子数组设置为主数组。我很好奇的是这是如何运作的。我假设了以下内容:

    masterLevel = new int[MAX_LEVELS][MAP_WIDTH][MAP_HEIGHT];
    for (int x = 0; x < MAP_WIDTH; x++) {
        for (int y = 0; y < MAP_HEIGHT; y++) {
            masterArray[currentLevel][x][y] = childArray1[x][y];
        }
    }

那会有用吗? 在我的应用程序中,事情不起作用,所以我选择了我不是100%肯定的代码。

3 个答案:

答案 0 :(得分:1)

在Java中,multi-d数组实际上是数组的数组。所以他们甚至可以脱节。 在您发布的代码中,您将引用一个未定义的名为currentLevel的变量。我确信这是在你没有发布的一些代码中定义的。另外不要忘记数组是零索引。这段代码应该有用。

masterArray = new int[MAX_LEVELS][MAP_WIDTH][MAP_HEIGHT];
for (int currentLevel = 0; currentLevel < MAX_LEVELS; currentLevel++) {
    for (int x = 0; x < MAP_WIDTH; x++) {
        for (int y = 0; y < MAP_HEIGHT; y++) {
                masterArray[currentLevel][x][y] = childArray1[x][y];
            }
        }
    }

如果您曾经使用大型数组并且需要速度,那么您可以查看System.arrayCopy();

答案 1 :(得分:1)

只要你按照与取出它们相同的方式放置一个3d数组,这并不重要。

根据您对其他答案的评论,您似乎遇到元素顺序问题([currentLevel][x][y] = childArray[y][x];

似乎你混合了MAP_HEIGHT和MAP_WIDTH。它应该是:

masterLevel = new int[MAX_LEVELS][MAP_HEIGHT][MAP_WIDTH];

然后你可以使用:

master[currentLevel][x][y] = childArray[x][y];

答案 2 :(得分:0)

    String[]        arr1D;
    String[][]      arr2D; 
    String[][][]    arr3D; 

    arr1D = new String[] { "1", "2", "3" };

    //////////////////////////////////////////////////////////////////////////
    //assign 1D array to element of 2D array
    ////////////////////////////////////////////////////////////////////////// 
    arr2D = new String[][] {  
                                arr1D ,
                                arr1D ,
                                arr1D 
                           }; 
     /*
     //  OR
     arr2D = new String[3][];
        arr2D[0] = arr1D;
        arr2D[1] = arr1D;
        arr2D[2] = arr1D;       
    //  OR 
     arr2D = new String[][] {  
        new String[] { "1", "2", "3" } ,
        new String[] { "1", "2", "3" } ,
        new String[] { "1", "2", "3" } 
                };      

    */
    //////////////////////////////////////////////////////////////////////////
    //assign 2D array to element of 3D array
    //////////////////////////////////////////////////////////////////////////

    arr3D = new String[][][] {  
            arr2D ,
            arr2D ,
            arr2D 
          }; 
    /*
    // OR   
        arr3D = new String[3][][]; 
        arr3D[0] = arr2D;
        arr3D[1] = arr2D;
        arr3D[2] = arr2D; 
    */