当我在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)
此外,如果有人知道反向迭代的更好的习语,我很乐意尝试。
答案 0 :(得分:87)
完全避免使用索引?怎么样:
for (ListIterator iterator = list.listIterator(list.size()); iterator.hasPrevious();) {
final Object listElement = iterator.previous();
}
答案 1 :(得分:64)
在list.size() - 1
开始迭代,因为数组(或ArrayList
)元素的编号从0到1小于列表的大小。这是一个相当标准的习语:
for (int j = list.size() - 1; j >= 0; j--) {
// whatever
}
请注意,您的前向迭代有效,因为它在到达list.size()
之前停止。
答案 2 :(得分:27)
我知道这是一个老问题,但Java包含Collections.reverse( List<T> )
方法。你为什么不反转它并进行迭代迭代?
答案 3 :(得分:12)
最优雅的方法是反转数组,然后使用直接(甚至隐式)迭代器:
Collections.reverse(arrayList);
for (Object item : arrayList) {
...
}
答案 4 :(得分:11)
list.size()超过了最后一个允许的索引。
for(int j = list.size() - 1; j >= 0; j--) {
System.out.println(list.get(j));
}
答案 5 :(得分:4)
Java数组是零索引的。 您必须设置j = list.size() - 1并继续直到j = 0。
答案 6 :(得分:3)
如果列表相当小,以致性能不是真正的问题,可以使用reverse
中Lists
- Google Guava
类的for-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]
产生以下结果:
for (final String someString : Lists.reverse(myList) {
//do something
}
这意味着myList的反向迭代可以写成:
{{1}}
答案 7 :(得分:0)
你可以反转一行
<强> Collections.reverse(列表); 强>
break
<强>输出强>
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);
答案 8 :(得分: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());
}