Estoy migrando un fragmento de código para hacer uso de genéricos. Un argumento para hacerlo es que el ciclo for es mucho más limpio que hacer un seguimiento de los índices o usar un iterador explícito.
En aproximadamente la mitad de los casos, la lista (una ArrayList) se itera en orden inverso mediante el uso de un índice hoy.
¿Alguien puede sugerir una forma más limpia de hacerlo (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.
java
collections
Allain Lalonde
fuente
fuente
for (int i = nodes.size(); --i >= 0;)
Respuestas:
Prueba esto:
fuente
listIterator
llamada, creo.Iterator
que use unListIterator
reverso, pero puede que no valga la pena para un ciclo.for (Node each : new ListReverse<Node>(nodes)) { }
Ofertas de guayaba
Lists#reverse(List)
yImmutableList#reverse()
. Como en la mayoría de los casos para Guava, el primero delega a este último si el argumento es unImmutableList
, por lo que puede usar el primero en todos los casos. Estos no crean nuevas copias de la lista, sino simplemente "vistas invertidas" de la misma.Ejemplo
fuente
No creo que sea posible usar la sintaxis del bucle for. Lo único que puedo sugerir es hacer algo como:
... pero no diría que esto es "más limpio" dado que será menos eficiente.
fuente
Opción 1: ¿Ha pensado en invertir la Lista con Colecciones # reverse () y luego usar foreach?
Por supuesto, es posible que también desee refactorizar su código de modo que la lista esté ordenada correctamente para que no tenga que revertirla, lo que usa espacio / tiempo adicional.
EDITAR:
Opción 2: Alternativamente, ¿podría usar una Deque en lugar de una ArrayList? Te permitirá iterar hacia adelante y hacia atrás
EDITAR:
Opción 3: como otros han sugerido, puede escribir un iterador que recorra la lista al revés, aquí hay un ejemplo:
fuente
descendingIterator()
.for each
expresión es la solución más idiomática en mi opinión. Es bueno darse cuenta de que esto es posible si su Lista implementa Iterable de una manera que itera hacia atrás. Usaré este enfoque y usaré la clase ReverseListIterator de Apache Commons Collections.Podría usar la clase concreta en
LinkedList
lugar de la interfaz generalList
. Entonces tienes undescendingIterator
para iterar con la dirección inversa.No sé por qué no hay
descendingIterator
conArrayList
...fuente
Esta es una vieja pregunta, pero carece de una respuesta amigable para java8. Aquí hay algunas formas de iterar en reversa la lista, con la ayuda de la API de Streaming:
fuente
Aquí hay una implementación (no probada) de a
ReverseIterable
. Cuandoiterator()
se llama, crea y devuelve unaReverseIterator
implementación privada , que simplemente asigna llamadashasNext()
ahasPrevious()
y las llamadas anext()
se asignanprevious()
. Significa que podría iterar sobre unaArrayList
inversa de la siguiente manera:Definición de clase
fuente
ReverseIterator
falta el constructor necesario y el código debe usarse enList
lugar deArrayList
.Si las listas son bastante pequeñas, de modo que el rendimiento no es un problema real, se puede usar el
reverse
método de laLists
clase enGoogle Guava
. Produce unfor-each
código bonito , y la lista original permanece igual. Además, la lista reversa está respaldada por la lista original, por lo que cualquier cambio en la lista original se reflejará en la reversa.Produce el siguiente resultado:
Lo que significa que la iteración inversa de myList se puede escribir como:
fuente
Crea una costumbre
reverseIterable
.fuente
Ejemplo muy simple:
fuente
Puede usar
ReverseListIterator
de Apache Commons-Collections:https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/iterators/ReverseListIterator.html
fuente
También encontré el método inverso de las colecciones de google .
fuente
Para tener un código que se vea así:
Pon este código en un archivo llamado "In.java":
fuente
listIterator
campo debe estar dentro de laIterator
implementación, no laIterable
implementación.name()
método, unordinal()
método y unstatic valueOf()
método, por ejemplo.Como se ha sugerido al menos dos veces, puede usar
descendingIterator
con aDeque
, en particular con aLinkedList
. Si desea utilizar el ciclo for-each (es decir, tener unIterable
), puede construir y utilizar un wraper como este:fuente
Motivo: "No sé por qué no hay ningún iterador descendente con ArrayList ..."
Dado que la lista de matriz no mantiene la lista en el mismo orden en que se agregaron los datos a la lista. Por lo tanto, nunca use Arraylist.
La lista vinculada mantendrá los datos en el mismo orden de AGREGAR a la lista.
Entonces, arriba en mi ejemplo, usé ArrayList () para hacer que el usuario tuerza su mente y haga que entrenen algo desde su lado.
En lugar de esto
UTILIZAR:
fuente