【问题标题】:Fake dynamic array using array structure in JavaJava中使用数组结构的假动态数组
【发布时间】:2012-10-10 12:41:26
【问题描述】:

这是我正在尝试做的事情以及我遇到的问题:我想“伪造”通往动态数组的方式。这意味着,使用普通的数组结构,只要它满了,我就会创建一个比旧数组大 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];

但这似乎并不能解决问题。

我还检查了所有 i 的空位,结果证明我有。该程序似乎正在“失去”整个新增长的部分。

/*/

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

【问题讨论】:

  • 检查nodes[i]对于某些i是否为空
  • ArrayList 实际上是用相同的思想实现的(但扩展因子不同)。
  • @gefei:是的,我有 null i 在我不知道的范围内。我认为这与深复制或浅复制有关,但我不确定。
  • 哪一行抛出异常?
  • @JakubZaverka 任何尝试在增长时访问任何新位置的方法都会引发 NPE。

标签: java arrays resize nullpointerexception


【解决方案1】:

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

【讨论】:

  • 它使用 java.utils.* 中的 Arrays.copyOf,我不应该使用该库中的任何东西。
  • 你看过Arrays.copyOf()的来源吗?
【解决方案2】:

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

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

aNew[i] = nodes[i];

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

此外,一旦一切正常,作为优化,请查看System.arrayCopy 以消除对循环的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 2015-02-13
    • 1970-01-01
    • 2020-11-09
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多