我有像这样的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()));
}
答案 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。但它使它们一个数组。