-1

次のような文字列配列があります。

String[][][][][] map = new String[9][13][2][1][1];

そして、次のように1つのフィールドを更新しようとしているとき:

map[0][0][1][0][1]  = "true";

すべてのフィールドが「true」に更新されています。これは次のとおりです。

map[0][1][1][0][1]

これです:

map[0][2][1][0][1]

なぜこれが起こっているのですか?

これは私のコードです:

int UP          = 0;
int UP_RIGHT    = 1;
int RIGHT       = 2;
int DOWN_RIGHT  = 3;
int DOWN        = 4;
int DOWN_LEFT   = 5;
int LEFT        = 6;
int LEFT_UP     = 7;

String[][][][][] map = new String[9][13][2][1][1];

public PitchMoveHelper() {
    String[][] move = {
            {String.valueOf(UP), "false"},
            {String.valueOf(UP_RIGHT), "false"},
            {String.valueOf(RIGHT), "false"},
            {String.valueOf(DOWN_RIGHT), "false"},
            {String.valueOf(DOWN), "false"},
            {String.valueOf(DOWN_LEFT), "false"},
            {String.valueOf(LEFT), "false"},
            {String.valueOf(LEFT_UP), "false"}
        };

    String[][] used = {{"used", "false"}};

    for(int z = 0; z < 9; z++) {
        for(int x = 0; x < 13; x++) {
            map[z][x][0] = used;
            map[z][x][1] = move;
        }
    }

    //this.updateLeftBand();
    //this.updateRightBand();
    //this.updateTopBand();
    //this.updateBottomBand();

    map[0][0][1][0][1]  = "true"; 

    System.out.println(Arrays.deepToString(getPitchMap()));
}
4

2 に答える 2

2

当面の問題は、配列が実際の文字列ではなく参照Stringを格納することです。あなたが言う時

map[z][x][0] = used;
map[z][x][1] = move;

( のすべての要素によって参照される単一インスタンスがあり、およびについても同じです。5 番目の添え字の 4 番目によってインデックス付けされた変更は、その単一のインスタンスを変更し、すべての添え字によって見られるものに影響を与えます。used[z][x][0]mapmove[z][x][1]

さらに明確にするために、次のエントリはすべてmap同じインスタンスを指しています。

map[0][0][0]
map[0][1][0]
       .
       .
map[0][12][0]
map[1][0][0]
  etc.

この問題を解決するには、ループ内のすべての割り当てに対して、usedおよびのディープ コピーを作成する必要があります。move

for(int z = 0; z < 9; z++) {
    for(int x = 0; x < 13; x++) {
        map[z][x][0] = deepCopy(used);
        map[z][x][1] = deepCopy(move);
    }
}

入力deepCopy()配列の完全なコピーを作成します。

String[][] deepCopy(String [][] arr)
{
    String[][] temp = new String[arr.length][];
    for (int i=0; i<arr.length; i++)
    {
         temp[i] = new String[arr[i].length];
         for (int j=0; j<arr[i].length; j++)
             temp[i][j] = arr[i][j];
    }
    return temp;
}
于 2012-11-15T19:38:03.157 に答える
1

あなたが認識する必要がある重要なことは、

int[][] example = new int[2][2];
example[1][0] = 1;
example[0] = example[1];

2 行目を最初の行にコピーしません。ただし、同じメモリへのALIASになります。つまり、行は最初の行と同じです

配列を要素ごとにコピーする場合は、使用します

System.arraycopy(...);

配列の配列をコピーしたい場合は、ディープコピーが必要です。

あなたにとって最も簡単なことは、すべてのエントリをコピーすることです。これは多少遅くなるかもしれませんが、おそらく今のところ簡単に使用できる概念です。

また:

array2 = array1;

array1 を array2 にコピーしません。しかし、それはそれらを1つの配列にします。

于 2012-11-15T19:56:33.187 に答える