Iterando a través de una lista en orden inverso en Java
Estoy migrando un fragmento de código para utilizar genéricos. Un argumento para hacerlo es que el bucle for es mucho más limpio que realizar un seguimiento de los índices o utilizar un iterador explícito.
En aproximadamente la mitad de los casos, la lista (una ArrayList) se itera en orden inverso utilizando un índice hoy.
¿Alguien puede sugerir una forma más limpia de hacer esto (ya que no me gusta indexed for loop
cuando trabajo con colecciones), aunque funciona?
for (int i = nodes.size() - 1; i >= 0; i--) {
final Node each = (Node) nodes.get(i);
...
}
Nota: No puedo agregar ninguna dependencia nueva fuera del JDK.
Prueba esto:
// Substitute appropriate type.
ArrayList<...> a = new ArrayList<...>();
// Add elements to list.
// Generate an iterator. Start just after the last element.
ListIterator li = a.listIterator(a.size());
// Iterate in reverse.
while(li.hasPrevious()) {
System.out.println(li.previous());
}
Ofertas de guayabaLists#reverse(List)
y ImmutableList#reverse()
. Como en la mayoría de los casos para Guava, el primero delega en el segundo si el argumento es un ImmutableList
, por lo que puedes usar el primero en todos los casos. Estos no crean nuevas copias de la lista, sino simplemente "vistas invertidas" de la misma.
Ejemplo
List reversed = ImmutableList.copyOf(myList).reverse();
No creo que sea posible usar la sintaxis del bucle for. Lo único que puedo sugerir es hacer algo como:
Collections.reverse(list);
for (Object o : list) {
...
}
... pero no diría que esto es "más limpio" dado que será menos eficiente.