2011-01-01 22 views
0

2次元配列を3次元配列に割り当てるときに問題が発生しているので、3d配列と2次元配列について質問したいと思っていました。Android Java 2次元配列を3次元配列に割り当てる

私は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}, 
}; 

[OK]を、私の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%確実ではないコードを選んでいます。

答えて

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]; 
+0

私はいつもそれが[列] [行]を読むことを前提としていました。 – semajhan

1

Javaマルチ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()を参照できます。

+0

currenLevelが定義されていますが、配列を習得する子配列を割り当てるとき、私はcurrentLevelを変更したくありませんでした。どうやら私はそれを動作させるようにしましたが、変数を切り替えなければなりませんでしたが、それでも私は混乱します。例:[currentLevel] [x] [y] = childArray [y] [x]; – semajhan

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; 
    */