itération inverse par ArrayList donne IndexOutOfBoundsException
Question
Quand j'inverse itérer sur un ArrayList Je reçois un IndexOutOfBoundsException. J'ai essayé de faire avancer l'itération et il n'y a pas de problème. Je pense et je sais qu'il ya cinq éléments dans la liste. Le code est ci-dessous:
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));
}
Forward itération - qui fonctionne très bien, mais pas utile pour moi:
for(int j=0;j<list.size();j++){
System.out.println(list.isEmpty());
System.out.println(list.get(j));
} // this worked fine
L'erreur:
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)
Aussi, si quelqu'un connaît un meilleur langage pour l'itération inverse, je serais heureux d'essayer cela.
La solution
Démarrer l'itération à list.size() - 1
parce réseau (ou ArrayList
) éléments sont numérotés de 0 à 1 inférieure à la taille de la liste. Ce langage est un assez standard:
for (int j = list.size() - 1; j >= 0; j--) {
// whatever
}
Notez que vos travaux avant d'itération, car il arrête avant pour atteindre list.size()
.
Autres conseils
Évitez les indices tout à fait? Que diriez-vous:
for (ListIterator iterator = list.listIterator(list.size()); iterator.hasPrevious();) {
final Object listElement = iterator.previous();
}
Je sais que c'est une vieille question, mais Java contient une méthode Collections.reverse( List<T> )
. Pourquoi ne pas inverser juste et faire avancer l'itération?
La façon la plus élégante est d'inverser le tableau, puis utiliser une iterator directe (ou même implicite):
Collections.reverse(arrayList);
for (Object item : arrayList) {
...
}
Le list.size () est passé le dernier indice admissible.
for(int j = list.size() - 1; j >= 0; j--) {
System.out.println(list.get(j));
}
tableaux Java sont zéro indexées. Vous devrez configurer j = list.size () -. 1 et continuer jusqu'à ce que j = 0
Si les listes sont assez petites pour que les performances ne sont pas un vrai problème, on peut utiliser la reverse
-metod de la Lists
-classe Google Guava
. Les rendements assez for-each
code, et la liste originale reste le même. En outre, la liste inversée est soutenue par la liste initiale, de sorte que toute modification de la liste initiale sera reflétée dans celle inversée.
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);
donne le résultat suivant:
[one, two, three]
[three, two, one]
[one, two, three, four]
[four, three, two, one]
Ce qui signifie que l'itération inverse de myList peut être écrit:
for (final String someString : Lists.reverse(myList) {
//do something
}
Vous pouvez inverser par une ligne qui est
Collections.reverse (liste);
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);
Sortie
Before Reverse Order : [A, B]
After Reverse : [B, A]
Vous pouvez le faire si vous êtes à l'aise avec boucle 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());
}