A iteração reversa através do ArrayList fornece indexOutOfBoundSexception
Pergunta
Quando reverter o itero sobre uma lista de Array, estou recebendo uma parte de base de BBOUNDSEXCECTION. Tentei fazer iteração avançada e não há problema. Espero e sei que existem cinco elementos na lista. O código está abaixo:
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));
}
A iteração avançada - que está funcionando bem, mas não é útil para mim:
for(int j=0;j<list.size();j++){
System.out.println(list.isEmpty());
System.out.println(list.get(j));
} // this worked fine
O erro:
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)
Além disso, se alguém souber de um idioma melhor para iteração reversa, ficaria feliz em experimentar isso.
Solução
Iniciar a iteração em list.size() - 1
Porque a matriz (ou ArrayList
) Os elementos são numerados de 0 a 1 a menos que o tamanho da lista. Este é um idioma bastante padrão:
for (int j = list.size() - 1; j >= 0; j--) {
// whatever
}
Observe que sua iteração avançada funciona porque para antes da chegando list.size()
.
Outras dicas
Evitar os índices completamente? Que tal:
for (ListIterator iterator = list.listIterator(list.size()); iterator.hasPrevious();) {
final Object listElement = iterator.previous();
}
Eu sei que essa é uma pergunta antiga, mas Java contém um Collections.reverse( List<T> )
método. Por que você não apenas reverteria e faria a iteração avançada?
A maneira mais elegante é reverter a matriz e depois usar um iterador direto (ou até implícito):
Collections.reverse(arrayList);
for (Object item : arrayList) {
...
}
O list.size () passou do último índice permitido.
for(int j = list.size() - 1; j >= 0; j--) {
System.out.println(list.get(j));
}
As matrizes Java são indexadas zero. Você precisará definir j = list.size () - 1 e continuar até J = 0.
Se as listas são bastante pequenas para que o desempenho não seja um problema real, pode -se usar o reverse
-Metod do Lists
-Class in Google Guava
. Produz bonito for-each
-Code, e a lista original permanece a mesma. Além disso, a lista invertida é apoiada pela lista original; portanto, qualquer alteração na lista original será refletida no revertido.
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);
Produz o seguinte resultado:
[one, two, three]
[three, two, one]
[one, two, three, four]
[four, three, two, one]
O que significa que a iteração reversa da MyList pode ser escrita como:
for (final String someString : Lists.reverse(myList) {
//do something
}
Você pode reverter em uma linha que é
Coleções.Reverse (lista);
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);
Resultado
Before Reverse Order : [A, B]
After Reverse : [B, A]
Você pode fazer isso se estiver confortável com o FOREach Loop.
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());
}