2012-10-10 38 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()'的来源吗? –