【问题标题】:Array of ArrayList JavaArrayList Java 数组
【发布时间】:2010-04-07 01:08:23
【问题描述】:

我正在创建一个包含多个队列的 PriorityQueue。我正在使用一个 Array 来存储构成我的不同 PriorityQueues 的多个 ArrayLists。到目前为止,这是我的构造函数:

ArrayList<ProcessRecord> pq;
ArrayList[] arrayQ;

  MultiList(){       
   arrayQ = new ArrayList[9];
   pq = new ArrayList<ProcessRecord>();
 }

当我试图获取整个数组的大小时,问题就出现了,即数组中每个ArrayList 的大小之和。

public int getSize() {

    int size = 0;

    for (int i = 1; i <= 9; i++) {
        size = size + this.arrayQ[i].size();
    }
    return size;
}

似乎不起作用。我是否正确声明了ArrayList 的数组?我不断收到一条错误消息,说 this.arrayQ[i].size() 不是一种方法。 ( .size() 是问题)

感谢您的帮助!

大卫

【问题讨论】:

  • 虽然我不认为这是您的问题的原因,但 for 循环将完全跳过数组中的第一个元素,并在结束时抛出 ArrayIndexOutOfBoundsException。 Java 数组是零索引的,因此 9 元素数组的有效索引是 0 到 8。
  • 为什么不使用一个数组或一个堆来实现 PriorityQueue?
  • 我在过去的分配中都使用过,这个应该是多个 PriorityQueues 并以每个队列的最大优先级循环方式输出它们。

标签: java arrays arraylist


【解决方案1】:

一些问题:

首先,Java 中的数组是零索引的,所以你的循环应该是:

for (int i = 0; i < 9; i++)

或者,如果长度发生变化,最好将魔术数字 9 替换为 arrayQ.length,让您的生活更轻松。

其次,你没有用 ArrayLists 填充你的数组——new ArrayList[9] 创建了一个包含九个 ArrayList 类型引用的数组,但所有这些引用都是空的。在构造函数中创建数组后,您需要自己实例化 ArrayList,方法如下:

for (int i = 0; i < arrayQ.length; i++)
    arrayQ[i] = new ArrayList<ProcessRecord>();

【讨论】:

  • 现在可以工作了,它在添加循环初始化数组中的每个元素时清除了。也许是 IDE 错误?
  • 也许指定ArrayList 包含在arrayQ 中的实例的类型参数会很有用,请考虑:ArrayList&lt;ProcessRecord&gt;[] arrayQ = (ArrayList&lt;ProcessRecord&gt;[]) Array.newInstance(ArrayList.class, 9);。这样,从arrayQArrayList 元素访问ProcessRecord 将不需要额外的类型转换。
【解决方案2】:

另外值得注意的是:我不确定你在做什么,但你为什么要混合 arraysArrayLists?这几乎可以肯定是一个糟糕的设计决策,最好使用ArrayList&lt;ArrayList&lt;Type&gt;&gt;

我看到您正在通过使用 ArrayList 而不是 ArrayList&lt;ProcessRecord&gt; 的数组来解决固有的设计失败,但这不是类型安全的,您应该使用正确的集合类型。

【讨论】:

  • 菜鸟问题,但是正确的收藏类型 Stefan 是什么意思?编程不是我主要关注的领域(计算机工程是我的专业),但我真的希望更好地理解正确的技术。
  • 使用列表而不是数组来强制实现您想要实现的语义。使用您的数组, array[i] = new ArrayList() 将编译。如果您使用 List 而不是数组,则无法编译。理想情况下,你应该尽早发现软件错误,如果你能在编译时发现这样的错误,你应该努力做到这一点。
【解决方案3】:

您需要进行一些空值检查。你的 for 循环假设它可以操作某些东西,但是你在 null 元素上调用 .size() 方法,这不起作用,它会抛出 NullPointerException。

您的循环也会遇到一些问题。数组索引从 0 开始,而不是 1。您的循环从 1 开始,由于您使用它来访问数组,因此您将从第二个元素开始,并尝试访问数组范围之外的 1 个元素,这将抛出 ArrayIndexOutofBoundsException。

【讨论】:

  • 正如所指出的,设计本身存在缺陷。我只是按照教授制定的模板进行操作。从 1 而不是 0 开始处理数组的原因是它使以后的输出更简单。有缺陷,但在这一点上是不可避免的。不过,我确实喜欢使用 array.length 的想法。感谢您提供有关 NullPointer 参考的信息。数组的初始化循环是我需要的。我还添加了一些错误检查以确保被引用的元素不为空。感谢大家的帮助!
猜你喜欢
  • 2011-04-08
  • 1970-01-01
  • 2018-11-26
  • 2023-03-31
  • 1970-01-01
  • 2014-03-24
  • 2018-12-20
  • 2012-05-15
  • 1970-01-01
相关资源
最近更新 更多