使用Java中的数组结构伪动态数组

时间:2012-10-10 12:41:27

标签: java arrays resize nullpointerexception

这就是我正在尝试做的事情和我遇到的问题:我想“伪造”到动态数组的方式。这意味着,使用普通的数组结构,只要它已满,我就会创建一个比旧数组大25%左右的新数组,然后将旧数组的元素复制到新数组中。

// 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];

但这似乎并没有解决问题。

我还检查了所有我的空位,结果证明我有。该计划似乎“失去了”整个新成长的部分。

/ * /

解决!在增长过程中添加新元素是一个问题。现在一切都很好。谢谢你的帮助。将发布更多信息以供将来参考。

2 个答案:

答案 0 :(得分:2)

看起来NPE是由getId调用引起的。

但是为什么要创建一个新节点呢?只是:

aNew[i] = nodes[i];

您的新数组应包含与旧数组相同的对象,而不是它们的克隆。

一旦它全部正常工作,作为优化,请查看System.arrayCopy以消除对循环的需求。

答案 1 :(得分:2)

使用来源:-) java.util.ArrayList这样做。例如,参见grow()方法