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.

Était-ce utile?

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());
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top