La méthode Collections.reverse retourne en fait une nouvelle liste avec les éléments de la liste d'origine copiés à l'envers, donc cela a une complexité en O(n) par rapport à la taille de la liste d'origine.
Comme solution plus efficace, vous pourriez écrire un décorateur qui présente une vue inversée d'une liste en tant qu'itérable. L'itérateur retourné par votre décorateur utiliserait le ListIterator de la liste décorée pour parcourir les éléments dans l'ordre inverse.
Par exemple:
public class Reversed implements Iterable {
private final List original;
public Reversed(List original) {
this.original = original;
}
public Iterator iterator() {
final ListIterator i = original.listIterator(original.size());
return new Iterator() {
public boolean hasNext() { return i.hasPrevious(); }
public T next() { return i.previous(); }
public void remove() { i.remove(); }
};
}
public static Reversed reversed(List original) {
return new Reversed(original);
}
}
Et vous l'utiliseriez comme ceci:
import static Reversed.reversed;
...
List someStrings = getSomeStrings();
for (String s : reversed(someStrings)) {
doSomethingWith(s);
}
7 votes
Le but de la boucle "for-each" est que vous avez juste besoin d'effectuer une opération sur chaque élément, et l'ordre n'est pas important. For-each pourrait traiter les éléments dans un ordre complètement aléatoire, et cela ferait toujours ce pour quoi il a été conçu. Si vous avez besoin de traiter les éléments d'une manière particulière, je vous suggérerais de le faire manuellement.
1 votes
Bibliothèque de collections Java. Pas vraiment lié au langage. Blâmer Josh Bloch.
7 votes
@muusbolla: Mais comme une liste est une collection ordonnée, son ordre sera sûrement respecté, n'est-ce pas ? Par conséquent, le for-each ne traitera pas les éléments d'une liste dans un ordre aléatoire.
5 votes
@muusbolla ce n'est pas vrai. Peut-être dans le cas des collections dérivées de
Set
.foreach
garantit l'itération dans l'ordre de l'itérateur retourné par la méthodeiterator()
de la collection. docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html0 votes
Je veux aussi cette fonctionnalité, en Python nous pourrions écrire cela
for row in rows[::-1]
pour effectuer une itération inversée. Pourquoi pas en Java?