通过 ArrayList 的反向迭代给出了 IndexOutOfBoundsException

2022-09-01 07:55:21

当我反向迭代 ArrayList 时,我得到的是 IndexOutOfBoundsException。我尝试进行向前迭代,没有问题。我期望并知道列表中有五个要素。代码如下:

Collection rtns = absRtnMap.values();
List list = new ArrayList(rtns);
Collections.sort(list);

for(int j=list.size();j>0;j=j-1){
  System.out.println(list.get(j));
}

前向迭代 - 工作正常,但对我没用:

for(int j=0;j<list.size();j++){
    System.out.println(list.isEmpty());
    System.out.println(list.get(j));
} // this worked fine

错误:

Exception in thread "Timer-0" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
    at java.util.ArrayList.RangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at model.Return.getReturnMap(Return.java:61)
    at controller.Poller$1.run(Poller.java:29)
    at java.util.TimerThread.mainLoop(Unknown Source)
    at java.util.TimerThread.run(Unknown Source)

此外,如果有人知道反向迭代的更好成语,我很乐意尝试一下。


答案 1

完全避免索引?怎么样:

for (ListIterator iterator = list.listIterator(list.size()); iterator.hasPrevious();) {
  final Object listElement = iterator.previous();
}

答案 2

开始迭代的起始位置,因为数组(或 )元素的编号从 0 到 1 小于列表的大小。这是一个相当标准的成语:list.size() - 1ArrayList

for (int j = list.size() - 1; j >= 0; j--) {
    // whatever
}

请注意,正向迭代之所以有效,是因为它在到达 之前停止。list.size()