No utilice el método Collections.reverse que en realidad invierte la lista original en su lugar. Si lo usa:
¡Manera incorrecta!
Collections.reverse(new ArrayList(stringList))
para evitar la modificación de la original, este devuelve una nueva lista con los elementos de la lista original copiado en ella en orden inverso, y tal tiene O (n) los requisitos de rendimiento y el espacio con respecto al tamaño de la lista original.
Como una solución más eficiente, podría escribir una clase que presente una vista invertida de una lista como un genérico Iterable. El iterador devuelto por su clase usaría el ListIterator de la lista decorada para caminar sobre los elementos en orden inverso.
Por ejemplo:
public class Reversed<T> implements Iterable<T> {
private final List<T> original;
public Reversed(List<T> original) {
this.original = original;
}
public Iterator<T> iterator() {
final ListIterator<T> i = original.listIterator(original.size());
return new Iterator<T>() {
public boolean hasNext() { return i.hasPrevious(); }
public T next() { return i.previous(); }
public void remove() { i.remove(); }
};
}
public static <T> Reversed<T> reversed(List<T> original) {
return new Reversed<T>(original);
}
}
Y que lo utilizaría como:
import static Reversed.reversed;
...
List<String> someStrings = getSomeStrings();
for (String s : reversed(someStrings)) {
doSomethingWith(s);
}
Curiosamente, leí esta pregunta a mitad de la lectura de la sección del libro Scala que se ocupa de las operaciones de lista inmutable ... una buena demostración de la falta de fuerza expresiva en Java. – skaffman
El punto del ciclo "para-cada" es que solo necesita realizar una operación en cada elemento, y el orden no es importante.Para-cada uno podría procesar los elementos en orden completamente aleatorio, y todavía estaría haciendo lo que fue diseñado. Si necesita procesar los elementos de una manera particular, le sugiero que lo haga de forma manual. – muusbolla
Biblioteca de colecciones Java. No tiene nada que ver con el lenguaje. Culpa a Josh Bloch. –