web-dev-qa-db-ja.com

ArrayListを逆方向に繰り返すとIndexOutOfBoundsExceptionが発生します

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)

また、誰かが逆反復のより良いイディオムを知っているなら、私はそれを試して喜んでいるでしょう。

30
Ankur

配列(またはArrayList)要素には、0からリストのサイズよりも小さい1までの番号が付けられているため、list.size() - 1で反復を開始します。これはかなり標準的なイディオムです:

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

前方反復が機能することに注意してくださいbeforelist.size()に達するまで停止します。

64
David Z

インデックスを完全に避けますか?どうですか:

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

これは古い質問ですが、JavaにはCollections.reverse( List<T> )メソッドが含まれています。

27
Snailer

最もエレガントな方法は、配列を逆にして、直接(または暗黙的な)イテレーターを使用することです:

Collections.reverse(arrayList);
for (Object item : arrayList) {
    ...
}
12
el fuego

List.size()は、最後の許容インデックスを超えています。

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

Java配列のインデックスはゼロです。 j = list.size()-1を設定し、j = 0になるまで続行する必要があります。

4
Coxy

リストがかなり小さく、パフォーマンスが実際の問題ではない場合は、Google Guavareverse- classのLists- metodを使用できます。 pretty for-each- codeを生成し、元のリストは同じままです。また、元に戻されたリストは元のリストに基づいているため、元のリストへの変更はすべて元に戻されたリストに反映されます。

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
}
3
Tobb

あなたはある1行で逆にすることができます

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]
0
Dharmbir Singh

これは、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());
}
0
Gopala Krishna