2012-11-15 33 views
-1

我有String数组,像这样的:Java的多阵列更新

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

,当我试图更新一个FILD,像这样:

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

每FILD被更新为 “真”,这一个:

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())); 
} 
+3

是不是你'ArrayIndexOutOfBoundsException'? –

+4

'map [0] [0] [1] [0] [1] =“true”'会首先抛出索引超出范围例外......这表明您可能不会运行您认为正在运行的代码... – assylias

+1

你不正确。用你在问题中提出的四行代码写一个简单的程序,你会检查它是不是真的。使用额外的代码我们可能会帮助更多 – SJuan76

回答

2

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

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

没有被所有的元素map[z][x][0](与同为move[z][x][1]被引用的used一个实例。通过5标第四届索引的任何变化正在改变单一实例,影响是什么都标看到

为了澄清更多的,都在map点以下条目相同的实例:

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

为了解决这个问题,你需要做的usedmove深拷贝在循环每一项任务:

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; 
} 
+0

Java字符串是不可变的,现有实例不能更改。 – hyde

+0

@Jim Garrison非常感谢这个答案,但我仍然不知道应该如何看待复制方法,你能帮助我吗? –

+0

@Jim你是我的英雄!谢谢! –

1

你需要认识到事情的关键是,

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

是否不得复制第二排第一位。但它使其成为同一个存储器 - 即行相同到第一个。

如果要复制一个数组,元素的每个元素,使用

System.arraycopy(...); 

如果你想要做的复制阵列的阵列,你需要深拷贝。

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

还是那句话:

array2 = array1; 

不会复制数组1到数组2。但它使他们一个阵列