2012-03-21 58 views
1

嗨,大家好我赶上例外:ArrayList中意外出局边界结果

java.lang.IndexOutOfBoundsException:指标:1,大小:0

代码如下所示:

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

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

也许有人可以帮助我做到这一点。


基本上我想这样做: 我已经例如字符喜欢这样的:

ABCEDFG 

和数组用数字:

321211 

我需要采取第一个字符和第一数。焦炭写为S的ArrayList:

S={"A"}; 

看号码并再次写入相同的字符在那个位置,如果数为3则排在第三位: (如数字1,那么只写它的ArrayList)

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

并从arrayLists中删除数字和字符。现在他们看起来像这样:

BCEDFG 

21211 

并且一直到最后一样。

回答

5

我怀疑你在容量大小之间混淆。这条线:

ArrayList decoded = new ArrayList(10); 

...创建一个具有容量的10(它不会需要在内部,直到第11要素加入长)的列表,但尺寸的0。只有索引,你可以添加任何东西是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 

或者,如果你已经知道你想要的大小,你可以使用数组来开始 - 他们有一个固定大小,每个元素是元素类型的默认值(因此null字符串,例如):

String[] decoded = new String[10]; 
decoded[1] = "S"; 
2

首先ArrayList s是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 )的性能。相反,你可以使用一个队列。或者实际上并没有从列表中删除元素,但只需要一个计数器即可记住到目前为止使用了多少元素。

0

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

而在你的情况,当你通过调用decoded.add(1, "A")index 1插入一个元素,您的列表decodedsize()0