2012-08-09 182 views
0

我一直在嘗試做2維數組的深拷貝,但從來沒有成功。 這是我的代碼。深拷貝2維數組

class node { 
    public node head; 
    public node left; 
    public node right; 
    public node up; 
    public node down; 
} 

node[][] OriginalArrayOfNode = new node[100][200]; 

//filling original node 
for (int n = 0; n < 200; n++) { 
    for(int m = 0; m < 100; m++) { 
     OriginalArrayOfNode[m][n].head = OriginalArrayOfNode[m][0]; 
     OriginalArrayOfNode[m][n].left = ... 
     //etc 
    } 
} 

node[][]CopyArrayOfNode = new node[100][200]; 
//The code to copy the original array to new array should be here. 

我的問題是我怎樣才能將我的OriginalArrayOfNode深拷貝到CopyArrayOfNode? 在此先感謝。

編輯:

我試着使循環雙向鏈表的副本,其中4個指針Knuth的舞蹈鏈接算法。追蹤問題的位置很難,但我假設原始數組由於Knuth的DL算法而給出「x」,那麼原始數組的正確深度副本也會給出「x」作爲結果,前提是沒有其他變量變化並且沒有隨機修飾符。但是,我嘗試過clone()方法,arrayutil.copy()方法,並且它們都沒有根據我上面的假設給出「正確的」深層副本。

+0

你有什麼問題嗎?你有什麼嘗試?你卡在哪裏? – user1118321 2012-08-09 03:42:30

+0

我無法複製我的2維數組。我試過克隆(),但它沒有奏效。 – JrL 2012-08-09 03:55:10

+0

我知道您在複製2維數組時遇到問題。你有什麼麻煩複制它?你嘗試了什麼不起作用?你在哪裏堅持複製?你需要更具體,否則很難提供幫助。 – user1118321 2012-08-09 03:59:03

回答

1

在我看來,你是以一種非常奇怪的方式複製這個;幾乎就像你試圖複製錯誤的方式。

我會做更是這樣的:

for (int m = 0; n < 200; m++) { 
    for(int n = 1; n < 100; n++) { 
     OriginalArrayOfNode[m][n].head = OriginalArrayOfNode[m][0].head; 
     OriginalArrayOfNode[m][n].left = OriginalArrayOfNode[m][0].left; 
     //etc 
    } 
} 

注:應該是從1開始N,因爲你是從如你從0複製到其他人複製。

然而,我建議你做的是,你的課程節點添加了clone()方法。然後克隆將提供原始類的精確副本。

class node { 
    public node head; 
    public node left; 
    public node right; 
    public node up; 
    public node down; 

    public node clone() { 
     final node clonedNode = new node(); 
     node.head = this.head; 
     node.left = this.left; 
     node.right = this.right; 
     node.up = this.up; 
     node.down = this.down; 
    } 
} 


for (int n = 1; n < 200; n++) { 
    OriginalArrayOfNode[n] = OriginalArrayOfNode[m].clone(); } 

這不是確切的代碼,但你明白我的意思。

最後,需要注意的另一件事是,如果您嘗試按照自己的方式進行深度複製,則可以使用ArrayUtil.copy(...)從索引1 - 200輕鬆填充。

希望這一切都有所幫助。

+0

感謝您的回覆:)讓我試試你的方式,我會再次回覆,如果它的作品:) – JrL 2012-08-09 04:24:05

+0

@frcb不用擔心隊友:) – 2012-08-09 04:29:46

+0

我似乎無法使它的工作。無論如何,我認爲生病只是將您的答案標記爲已接受,因爲我放棄了嘗試製作深層複製並重新聲明並重新填充新陣列。無論如何謝謝:) – JrL 2012-08-09 04:44:24

1

我認爲OriginalArrayOfNode包含引用同一陣列中的其他節點的節點?在這種情況下,您將無法進行深層複製,除非您加強node數據結構以包含其自己的2d索引。例如,如果OriginalArrayOfNode[0][0].right碰巧指的是OriginalArrayOfNode[15][27],則在將結果分配給CopyArrayOfNode[0][0].right之前,您將無法弄清楚是否需要從舊陣列到新陣列執行索引[15][27]的深層副本,除非您搜索舊陣列徹底使用對象身份。即使你可以忍受蠻力搜索所有節點,或者你可以修改node數據結構以包含它自己的索引,也可能會有通過跟隨這些鏈接形成的循環,使任何嘗試確定正確的順序來複制事物。如果你可以保證有一定的鏈接鏈接不會導致循環,並且你可以有效地確定每個節點的二維索引,你可能有機會。

+0

是的:)我想到了複雜化,因此我放棄了試圖做一個深層複製,然後聲明然後填充一個新的數組。儘管我設法深度複製陣列,但它會像創建一個新的陣列一樣效率低下。不管怎麼說,還是要謝謝你 :) – JrL 2012-08-09 10:32:11