2012-10-10 74 views
0

下面是我正在做的和我遇到的問題:我想「假」到動態數組的方式。這意味着,使用正常的數組結構,並且每當它滿時,我會創建一個比舊數組大25%的新數組,然後將舊數組的元素複製到新數組中。在Java中使用數組結構的假動態數組

// Whenever my original nodes array is full 
Node aNew[]; 
aNew = new Node[newDesiredSize]; 
//I create every new element in the new array for this to be a deep copy 
for (int i=0; i<numVert; i++){ 
    aNew[i] = new Node(nodes[i].getId()); 
} 
nodes = aNew; 

但是,這似乎並沒有工作,因爲當我嘗試填充和訪問我的新創建的數組,我得到了NullPointerException錯誤。

我一直在與這種僞裝成動態數組的方式鬥爭,但我顯然錯過了一些東西。

使用ArrayList或任何其他形式的真正動態結構是不允許的。

/* **/

編輯:建議後,我改變了

aNew[i] = new Node(nodes[i].getId()); 

aNew[i] = nodes[i]; 

但這似乎並沒有被解決問題。

我也檢查了所有我的空地方,事實證明,我有。該計劃似乎是「放鬆」整個新增部分。

/*/

解決了!增加新元素是一個問題。現在都很好。謝謝你的幫助。將發佈更多信息以供將來參考。

+0

檢查節點[i]對於某些我是否爲空 – gefei

+1

ArrayList實際上是用相同的想法實現的(但擴展因子不同)。 – nhahtdh

+0

@gefei:是的,我有空,我的範圍是我沒有的。我認爲這是與深層或淺層複製有關的事情,但我不確定。 – MelecioPonte

回答

2

看起來NPE是由getId調用引起的。

但爲什麼要創建一個新節點呢?只是:

aNew[i] = nodes[i]; 

你的新數組應該包含與舊數組相同的對象,而不是它們的克隆。

再加上一次所有的工作,作爲優化,看看System.arrayCopy刪除循環的需要。

2

使用來源:-) java.util.ArrayList這樣做。例如見grow()方法

+0

它使用了java.utils。*的一部分Arrays.copyOf,我不應該使用該庫中的任何內容。 – MelecioPonte

+0

你看過'Arrays.copyOf()'的來源嗎? –