【问题标题】:How to fill a List of Lists?如何填写列表列表?
【发布时间】:2017-04-17 16:40:47
【问题描述】:

我创建了一个这样的列表列表:

List<List> tmp = new ArrayList<List>(2);

然后我想在第一个子列表中插入 10,如下所示:

tmp.get(0).add(10);

但是,我收到以下错误:

线程“主”java.lang.IndexOutOfBoundsException 中的异常:索引:0,大小:0 在 java.util.ArrayList.rangeCheck(ArrayList.java:653) 在 java.util.ArrayList.get(ArrayList.java:429)

错误的根源是什么,我该如何克服?

【问题讨论】:

  • "我创建了一个这样的列表列表" 您实际上并没有创建列表列表,只是一个列表。
  • tmp.size().....
  • @takendarkk - 从语义上讲,他们确实创建了一个列表列表,它目前的长度恰好为 0。
  • 是的,我想这取决于你如何看待它。我认为这只是一个列表 - 一旦有东西在里面然后它就是一个东西的列表。
  • TL;DR - 您调用的构造函数会创建一个初始容量为 2 项的空列表。为避免该错误,请在外部列表中添加一些列表。

标签: java arraylist


【解决方案1】:

您创建了一个初始容量为 2 的空列表(即,在您向其中添加 2 个元素并添加第三个元素之前,列表的内部表示不会调整大小)。

然后您尝试从空列表中获取第一个元素。这自然是行不通的。您需要首先 add() 尽可能多的内部列表(可能是 2 个),然后然后填充这些内部列表。

【讨论】:

  • 我明白了。谢谢你的回答。
【解决方案2】:

您尚未初始化内部列表。这就是您收到错误的原因。

以下代码将初始化每个内部列表。

int initialCapacity=2;
List<List> tmp = new ArrayList<List>(initialCapacity);
for(int i = 0; i < initialCapacity; i++)
     tmp.add(new ArrayList());

【讨论】:

  • 那个 for 循环不会解决任何问题,因为它会迭代(或者更确切地说不迭代)空列表。
  • 是的,您仍然需要在外部列表中调用 set() 或类似的名称才能真正将内容放入其中。
  • 更新了答案。
  • 而且......它仍然不起作用,因为 size() 最初为零。
  • @AndyThomas 我想如果我对大小进行硬编码,它将起作用,例如nSize = 2 然后做这个迭代。
【解决方案3】:

您尚未向列表中添加任何内容。声明初始容量为 2 的任何类型的 List 不会自动填充它。你必须先这样做。

【讨论】:

  • 列表没有大小 2 - 它的初始 容量 为 2。初始大小为零。
猜你喜欢
  • 2020-09-09
  • 2013-07-07
  • 1970-01-01
  • 2013-12-18
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
相关资源
最近更新 更多