Iterando a través de una lista en orden inverso en Java

Resuelto Allain Lalonde asked hace 14 años • 18 respuestas

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 loopcuando 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.

Allain Lalonde avatar Jan 20 '10 22:01 Allain Lalonde
Aceptado

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());
}
John Feminella avatar Jan 20 '2010 15:01 John Feminella

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();
Geoffrey Zheng avatar Mar 07 '2013 15:03 Geoffrey Zheng

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.

Adamski avatar Jan 20 '2010 15:01 Adamski