Java多数组更新
我有这样的字符串数组:Java多数组更新,java,arrays,multidimensional-array,Java,Arrays,Multidimensional Array,我有这样的字符串数组: String[][][][][] map = new String[9][13][2][1][1]; map[0][1][1][0][1] 当我尝试更新一个文件时,如下所示: map[0][0][1][0][1] = "true"; 每个fild都在更新为“真”,这一个: String[][][][][] map = new String[9][13][2][1][1]; map[0][1][1][0][1] 这个: String[][][][][] map
String[][][][][] map = new String[9][13][2][1][1];
map[0][1][1][0][1]
当我尝试更新一个文件时,如下所示:
map[0][0][1][0][1] = "true";
每个fild都在更新为“真”,这一个:
String[][][][][] map = new String[9][13][2][1][1];
map[0][1][1][0][1]
这个:
String[][][][][] map = new String[9][13][2][1][1];
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()));
}
int UP=0;
int UP_RIGHT=1;
int右=2;
int DOWN_RIGHT=3;
int-DOWN=4;
int DOWN_LEFT=5;
int左=6;
int LEFT_UP=7;
字符串[]映射=新字符串[9][13][2][1][1];
公众谘询服务({
字符串[][]移动={
{String.valueOf(UP),“false”},
{String.valueOf(右上角),“false”},
{String.valueOf(右),“false”},
{String.valueOf(右下角),“false”},
{String.valueOf(DOWN),“false”},
{String.valueOf(左下角),“false”},
{String.valueOf(左),“false”},
{String.valueOf(左上方),“false”}
};
字符串[][]used={{“used”,“false”};
对于(intz=0;z<9;z++){
对于(int x=0;x<13;x++){
map[z][x][0]=已使用;
地图[z][x][1]=移动;
}
}
//this.updateLeftBand();
//this.updateRightBand();
//this.updateTopBand();
//这个.updateBottomBand();
map[0][0][1][0][1]=“true”;
System.out.println(Arrays.deepToString(getPitchMap());
}
您眼前的问题是字符串
数组存储的是引用,而不是实际字符串。当你说
map[z][x][0] = used;
map[z][x][1] = move;
有一个使用的实例被[z][x][0]
地图的所有元素[z][x][0]
引用(对于移动和[z][x][1]
也是如此)。任何由第5个下标中的第4个索引的更改都会更改该单个实例,影响所有下标看到的内容
为了进一步说明,map
中的以下所有条目都指向同一个实例:
map[0][0][0]
map[0][1][0]
.
.
map[0][12][0]
map[1][0][0]
etc.
要解决此问题,您需要为循环中的每个作业制作一份已用
和移动
的深度副本:
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);
}
}
你需要意识到的关键是
int[][] example = new int[2][2];
example[1][0] = 1;
example[0] = example[1];
不会将第二行复制到第一行,但会将其作为同一内存的别名,即该行与第一行相同
如果要复制数组(每个元素一个元素),请使用
System.arraycopy(...);
如果要复制一组数组,则需要一个深度副本
最简单的方法是复制每个条目。这可能会稍微慢一点,但这可能是您现在可以轻松使用的概念
再次:
array2 = array1;
不会将数组1复制到数组2。但它会使它们成为一个数组你不是得到了数组索引边界外异常吗?映射[0][0][1][1]=“true”
将首先抛出索引越界异常…这表明您可能没有运行您认为正在运行的代码…您做得不对。用您在问题中输入的四行代码编写一个简单的程序,您将检查它是否为真。使用其他代码,我们可能会提供更多帮助。这是不可能的。它应该抛出该异常。您正在访问末尾的索引1
,这是超出范围的,因为最后一个括号中的大小是1
。为什么不考虑不同的数据结构来解决您的问题呢?这样做太多,您将完全与正在使用的索引混淆。Java字符串是不可变的表,现有实例无法更改。@Jim Garrison非常感谢您的回答,但我仍然不知道deepCopy方法应该是什么样子,您能帮我吗?@DawidSajdak这解决了您当前的问题,但更大的问题是您选择的数据结构。5维数组总是很难理解和删除你应该试着从列表和地图的角度来考虑这个问题。