ArrayList数据结构索引超出范围

时间:2015-08-13 20:04:35

标签: java arrays

我正在尝试使用此代码创建一个初始大小为10的数组列表。

List<EWSMessage> messages = new ArrayList<EWSMessage>(10);
List<EWSMessage> newMessages =  new ArrayList<EWSMessage>(startMessages.size() - 10);

for (int i = 0, count = startMessages.size(); i < count; i++) {
  if (i < 10) {
    messages.set(i, startMessages.get(i));
  } else {
    newMessages.set(i - 10,startMessages.get(i));
  }
}

我的问题是我需要填充数组列表才能在for循环中设置值。我只是不明白该怎么做。此外,startMessages在方法中声明为List<EWSMessages>

3 个答案:

答案 0 :(得分:2)

此行创建一个列表,初始容量为10 - 但大小为零。

List<EWSMessage> messages = new ArrayList<EWSMessage>(10);

提供初始容量是可选的。当您向其中添加元素时,列表将会增长。

添加元素的简便方法是使用add() method

List<EWSMessage> messages = new ArrayList<EWSMessage>();
List<EWSMessage> newMessages =  new ArrayList<EWSMessage>();

for (int i = 0, count = startMessages.size(); i < count; i++) {
    if (i < 10) {
        messages.add( startMessages.get(i));
    } else {
        newMessages.add( startMessages.get(i));
    }
}

答案 1 :(得分:1)

ArrayList不是数组。在数组中,当您创建它时,您会说出您需要多少个位置,然后您可以访问所有这些位置。如果你说:

int[] arr = new int[10];

然后您可以立即使用arr[5]arr[8]等。

ArrayList不是那样的。它只有添加的项目数量。传递给构造函数的数字只是告诉它您认为可能需要多少个位置,但它不是列表中可用的项目数 - 初始大小为0.在您add项目之后,大小是1,依此类推。因此,在创建列表时,您实际上不必传递数字:

List a = new ArrayList();  // The size is 0 but you can add items.
List b = new ArrayList(10); // The size is also 0! The 10 is just the capacity!

set方法更改现有项。如果您没有添加项目,那么它将无法工作 - 它抱怨您正在尝试更改不存在的项目。首先,您需要使用add将项目添加到列表中,然后您可以使用set更改它们。

如果您需要撤消列表,可以使用Collections.reverse(list)。它将反转给定的列表。如果你想要一个直列表和一个反向列表,你可以这样做:

// Fill list 1 by adding to it, then:

List list2 = new ArrayList(list1);
Collections.reverse(list2);

这会首先将所有项目从list1复制到list2,然后反转list2

答案 2 :(得分:0)

BTW一种不同的方法,可以创建由原始列表支持的视图。

int size = startMessages.size();
List<EWSMessage> messages = startMessages.subList(0, Math.min(10, size));
List<EWSMessage> newMessages =  startMessages.subList(10, Math.max(10, size));

我会声称这更清楚,但是对于少于10的最小/最大检查。

相关问题