ArrayList意外超出边界结果

时间:2012-03-21 17:49:01

标签: java arraylist

大家好我抓住了例外:

  

java.lang.IndexOutOfBoundsException:Index:1,Size:0

代码看起来像这样:

 **ArrayList decoded = new ArrayList(10);
        decoded.add(1, "A");**

我真的不明白这里有什么不对吗?

也许有人可以帮我解决这个问题。


基本上我想这样做: 我有chars例如喜欢这个:

ABCEDFG

带数字的数组:

321211

我需要先取一个char和第一个数字。 char写入S arrayList:

S={"A"};

查看数字并在该位置再次写入相同的字符,如果数字为3,则在第三位: (如果是数字1,那么只需将它写在arrayList中)

S={"A","","","A"}

从arrayLists中删除number和char。现在他们看起来像这样:

BCEDFG

21211
直到最后再次相同。

3 个答案:

答案 0 :(得分:5)

我怀疑你在容量 size 之间感到困惑。这一行:

ArrayList decoded = new ArrayList(10);

...创建一个容量为10的列表(在添加第11个元素之前不需要内部增长),但 size 为0 。 only 索引你可以添加任何东西是0。

如果您希望能够在任意位置设置值,则应首先填充列表,例如(仅仅因为我讨厌使用原始类型而使用泛型):

List<String> decoded = new ArrayList<String>(10);
for (int i = 0; i < 10; i++) {
    decoded.add(""); // Or perhaps null
}

...
decoded.set(1, "S"): // This is now fine, replacing element 1

或者,如果您已经知道所需的大小,则可以使用数组开始 - 它们具有固定的大小,并且每个元素都是元素类型的默认值(所以{ {1}}对于字符串,例如):

null

答案 1 :(得分:2)

首先ArrayList的索引是0.要在第一个索引添加,你必须使用它:

decoded.add(0, "A");

或者到目前为止添加到列表的末尾(我认为这是你真正想要的):

decoded.add("A");

此外,除非在索引0,1,... n-1处已有元素,否则不能在索引n处插入元素。如果您想读取和写入任意索引,那么您应该在每个索引处使用空值初始化ArrayList,或者只使用数组:

String[] decoded = new String[10];
decoded[1] = "A";

我还建议你从循环中的ArrayList的开头删除每个元素,因为这将给出O(n 2 )性能。相反,你可以使用队列。或者实际上不要从列表中删除元素,但只需要一个计数器来记住到目前为止已经使用了多少元素。

答案 2 :(得分:0)

查看ArrayList.add(int index, E element)的API文档。它清楚地说该方法会抛出IndexOutOfBoundsException - if index is out of range (index < 0 || index > size()).

如果您通过调用index 1decoded.add(1, "A")处插入元素,则列表size()的{​​{1}}为decoded