-1

我有这样的字符串数组:

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

当我尝试更新一个文件时,像这样:

map[0][0][1][0][1]  = "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;

有一个被( 和 的所有元素引用的单个实例。任何由第 4 个或第 5 个下标索引的更改都会更改该单个实例,从而影响所有下标看到的内容。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);
    }
}

WheredeepCopy()生成输入数组的完整副本。

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

不将第二行复制到第一行。但它使它成为同一内存的别名- 即该行与第一行相同

如果你想复制一个数组,一个元素一个元素,使用

System.arraycopy(...);

如果你想复制一个数组数组,你需要一个深拷贝。

对您来说最简单的事情是复制每个条目。这可能会慢一些,但它可能是您现在可以轻松使用的概念。

再次:

array2 = array1;

不将 array1 复制到 array2。但这使它们成为一个数组

于 2012-11-15T19:56:33.187 回答