33

当我对 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)

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

4

9 回答 9

88

完全避免索引?怎么样:

for (ListIterator iterator = list.listIterator(list.size()); iterator.hasPrevious();) {
  final Object listElement = iterator.previous();
}
于 2009-06-30T13:08:26.430 回答
67

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

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

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

于 2009-02-24T02:47:53.333 回答
28

我知道这是一个老问题,但 Java 包含一个Collections.reverse( List<T> )方法。为什么不直接反转它并进行前向迭代?

于 2011-07-04T18:52:08.740 回答
13

最优雅的方法是反转数组,然后使用直接(甚至隐式)迭代器:

Collections.reverse(arrayList);
for (Object item : arrayList) {
    ...
}
于 2012-08-29T18:33:35.930 回答
11

list.size() 超过了最后一个允许的索引。

for(int j = list.size() - 1; j >= 0; j--) {
  System.out.println(list.get(j));
}
于 2009-02-24T02:48:19.230 回答
4

Java 数组是零索引的。您必须设置 j = list.size() - 1 并继续直到 j = 0。

于 2009-02-24T02:48:19.197 回答
3

如果列表相当小以至于性能不是一个真正的问题,可以使用-class in的reverse-metod 。产生漂亮的代码,并且原始列表保持不变。此外,反向列表由原始列表支持,因此对原始列表的任何更改都将反映在反向列表中。ListsGoogle Guavafor-each

import com.google.common.collect.Lists;

[...]

final List<String> myList = Lists.newArrayList("one", "two", "three");
final List<String> myReverseList = Lists.reverse(myList);

System.out.println(myList);
System.out.println(myReverseList);

myList.add("four");

System.out.println(myList);
System.out.println(myReverseList);

产生以下结果:

[one, two, three]
[three, two, one]
[one, two, three, four]
[four, three, two, one]

这意味着 myList 的反向迭代可以写成:

for (final String someString : Lists.reverse(myList) {
    //do something
}
于 2014-05-27T08:44:16.340 回答
0

您可以反转一行,即

Collections.reverse(list);

ArrayList arrayList = new ArrayList();

arrayList.add("A");
arrayList.add("B");

System.out.println("Before Reverse Order : " + arrayList);

Collections.reverse(arrayList);

System.out.println("After Reverse : " + arrayList);

输出

Before Reverse Order : [A, B]
After Reverse : [B, A]
于 2016-05-29T18:12:25.813 回答
0

如果您对 foreach 循环感到满意,则可以这样做。

List<String> list = new ArrayList<String>();
list.add("ABC");
list.add("DEF");
list.add("GHI");

ListIterator<String> listIterator = list.listIterator(list.size());

while(listIterator.hasPrevious()){
  System.out.println(listIterator.previous());
}
于 2018-06-09T17:21:43.587 回答