2014-08-29 16 views
0

我有一個2維陣列和堆棧:推(INT [] [])中的堆疊被複制相同的值的Java

int[][] data = new int[][]; 
Stack<int[][]> undoList = new Stack<int[][]>(10); 

我想每次更改後的數據添加到保持在撤消列表:

undoList.push(data); 
// some changes to data array 
undoList.push(data); 
// some changes to data array 
undoList.push(data); 

那麼爲什麼所有的堆棧元素都有相同的值?

+1

看起來像你使用存儲在'data'相同的參考。在將它推入你的'Stack'之前創建一個新的'int [] []'。 – 2014-08-29 16:51:20

+1

這當然是複製副本的重複...但我沒有設法找到這條鏈的開始。 – Marco13 2014-08-29 16:52:41

+0

@ Marco13是data.clone()在這裏工作嗎? – MBH 2014-08-29 16:54:32

回答

0

我解決了這個問題,因爲@ Marco13有在上面的評論中提及:

深複製

public static int[][] deepCopyArray(int[][] oldArray){ 
     int[][] newArray = new int[oldArray.length][]; 
     for(int i=0; i<oldArray.length; i++) 
     { 
      newArray[i] = new int[oldArray[i].length]; 
      for(int j=0; j<oldArray[i].length; j++) 
       newArray[i][j] = oldArray[i][j]; 
     } 
     return newArray; 
    } 
2

您正在對陣列進行更改 - 但是您並未將陣列本身放在堆棧上...您將參考添加到堆棧上的陣列。你基本上多次推送相同的參考。如果你想要獨立的值,你需要獨立的數組。

認爲參考書有點像寫在紙上的街道地址(其中紙片通常是變量)。你現在擁有的是一本書,每本書都有相同的街道地址。你可能已經去了,在每一頁上寫下了房子的前門,但這並不意味着我們可以看到所有這些不同的顏色 - 只涉及一個房子。如果你想擁有許多不同房屋的街道地址,有很多不同顏色的大門,你需要建造許多不同的房屋...