33

ArrayList を逆に繰り返すと、IndexOutOfBoundsException が発生します。前方反復を実行してみましたが、問題はありません。リストには 5 つの要素があることを期待し、知っています。コードは以下のとおりです。

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

Avoid indexes altogether? How about:

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

最も洗練された方法は、配列を逆にして、直接 (または暗黙の) iterator を使用することです。

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

パフォーマンスが実際の問題にならないほどリストがかなり小さい場合は、 のreverse-class の -method を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]

つまり、 myList の逆反復は次のように記述できます。

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