Java多阵列更新

时间:2012-11-15 19:17:01

标签: java arrays multidimensional-array

我有像这样的String数组:

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

当我尝试更新一个fild时,就像这样:

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

每个fild都会更新为“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()));
}

2 个答案:

答案 0 :(得分:2)

您当前的问题是String数组存储引用,而非实际字符串。当你说

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

used的所有元素[z][x][0]都引用了map单个实例(move和{{ 1}}。由第5个下标的第4个下标索引的任何更改都会改变该单个实例,从而影响所有下标的内容。

为了澄清更多,[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()

答案 1 :(得分:1)

你需要意识到的关键是

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

NOT COPY 第二行是否为第一行。但是它使同一个内存成为 ALIAS - 即行相同。

如果要复制数组,每元素元素,请使用

System.arraycopy(...);

如果要复制数组数组,则需要深层复制。

最简单的方法是,如果你复制每一个条目。这可能有点慢,但它可能是您现在可以轻松使用的概念。

再次:

array2 = array1;

不会复制 array1到array2。但它使它们一个数组