大家好我抓住了例外:
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
直到最后再次相同。
答案 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 1
在decoded.add(1, "A")
处插入元素,则列表size()
的{{1}}为decoded
。