Necesito ejecutar una lista en orden inverso usando Java.
Entonces, ¿dónde lo hace?
for(String string: stringList){
//...do something
}
¿Hay alguna forma de iterar el stringList en orden inverso usando el para cada sintaxis?
Para mayor claridad: sé cómo iterar una lista en orden inverso, pero me gustaría saber (por curiosidad) cómo hacerlo en cada estilo.
Set
colecciones derivadas.foreach
garantiza la iteración en el orden del iterador devuelto por eliterator()
método de la colección. docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.htmlRespuestas:
El método Collections.reverse en realidad devuelve una nueva lista con los elementos de la lista original copiados en orden inverso, por lo que tiene un rendimiento O (n) con respecto al tamaño de la lista original.
Como una solución más eficiente, podría escribir un decorador que presente una vista inversa de una Lista como Iterable. El iterador devuelto por su decorador usaría el ListIterator de la lista decorada para recorrer los elementos en orden inverso.
Por ejemplo:
Y lo usarías como:
fuente
Para obtener una lista, puede utilizar la Biblioteca de guayaba de Google :
Tenga en cuenta que no invierte toda la colección, ni hace nada parecido, solo permite la iteración y el acceso aleatorio, en el orden inverso. Esto es más eficiente que invertir la colección primero.
Lists.reverse
Para revertir un iterativo arbitrario, tendría que leerlo todo y luego "reproducirlo" al revés.
(Si no está ya a usarlo, me gustaría a fondo recomendamos echar un vistazo a la guayaba . Es una gran cosa.)
fuente
La Lista (a diferencia del Conjunto) es una colección ordenada e iterar sobre ella conserva el orden por contrato. Hubiera esperado que una pila iterara en el orden inverso, pero desafortunadamente no lo hace. Entonces, la solución más simple que se me ocurre es esta:
Me doy cuenta de que esta no es una solución de bucle "para cada". Prefiero usar el bucle for que presentar una nueva biblioteca como Google Collections.
Collections.reverse () también hace el trabajo pero actualiza la lista en lugar de devolver una copia en orden inverso.
fuente
for each
sintaxisEsto alterará la lista original y también debe llamarse fuera del bucle. Además, no desea realizar una inversión cada vez que realiza un bucle, ¿sería eso cierto si
Iterables.reverse ideas
se aplicara uno de los ?fuente
AFAIK no hay un tipo estándar de "reverse_iterator" en la biblioteca estándar que admita la sintaxis para cada uno, que ya es un azúcar sintáctico que introdujeron tarde en el lenguaje.
Puede hacer algo como por (Elemento del elemento: myList.clone (). Reverse ()) y pagar el precio asociado.
Esto también parece bastante coherente con el fenómeno aparente de no brindarle formas convenientes de realizar operaciones costosas, ya que una lista, por definición, podría tener una complejidad de acceso aleatorio O (N) (podría implementar la interfaz con un solo enlace), revertir la iteración podría terminar siendo O (N ^ 2). Por supuesto, si tiene una ArrayList, no paga ese precio.
fuente
Esto puede ser una opción. Espero que haya una mejor manera de comenzar desde el último elemento que hasta el bucle while hasta el final.
fuente
A partir del comentario : Debería poder usar Apache Commons
ReverseListIterator
Como dijo @rogerdpack , debe envolver el
ReverseListIterator
comoIterable
.fuente
No sin escribir un código personalizado que le dará un enumerador que revertirá los elementos por usted.
Debería poder hacerlo en Java creando una implementación personalizada de Iterable que devolverá los elementos en orden inverso.
Luego, creará una instancia del reiniciador (o llamará al método what-have-you) que devolvería la implementación Iterable que invierte el elemento en cada ciclo.
fuente
Puede usar la clase de colecciones http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html para invertir la lista y luego repetir.
fuente
Tendrá que revertir su colección si desea usar la sintaxis para cada caja y hacerla en orden inverso.
fuente
Todas las respuestas anteriores solo cumplen el requisito, ya sea envolviendo otro método o llamando a algún código extranjero fuera;
Aquí está la solución copiada de Thinking in Java 4th edition , capítulo 11.13.1 AdapterMethodIdiom ;
Aquí está el código:
fuente
int current = size() - 1
correcto? ¿por qué no elint current = this.size() - 1
oint current = super.size() - 1
Un trabajo alrededor:
O con guayaba :
fuente
Definitivamente una respuesta tardía a esta pregunta. Una posibilidad es usar el ListIterator en un bucle for. No es tan limpio como la sintaxis de dos puntos, pero funciona.
El crédito por la sintaxis de ListIterator va a "Formas de iterar sobre una lista en Java"
fuente