¿Cuál es la forma más simple de revertir esta ArrayList?
ArrayList<Integer> aList = new ArrayList<>();
//Add elements to ArrayList object
aList.add("1");
aList.add("2");
aList.add("3");
aList.add("4");
aList.add("5");
while (aList.listIterator().hasPrevious())
Log.d("reverse", "" + aList.listIterator().previous());
No es la forma más simple, pero si eres fanático de la recursividad, es posible que te interese el siguiente método para revertir una ArrayList:
O no recursivamente:
fuente
int j
no se actualiza con cada iteración? Lo inicializaj = list.size() - 1
pero no creo que la sección de inicialización delfor loop
se actualice con cada iteración, ¿verdad?IndexOutOfBoundsException
mensaje ya que está intentando accederj
(el último índice de la Lista de Array original) pero ya eliminó el objeto en ese índice?add()
empuja a los otros elementos hacia abajo en la matriz, por lo que la matriz permanece esencialmente un tamaño constante. Soluciones interesantes, gracias!El truco aquí es definir "revertir". Se puede modificar la lista en su lugar, crear una copia en orden inverso o crear una vista en orden inverso.
La forma más simple, intuitivamente hablando , es
Collections.reverse
:Este método modifica la lista en su lugar . Es decir,
Collections.reverse
toma la lista y sobrescribe sus elementos, sin dejar ninguna copia no invertida. Esto es adecuado para algunos casos de uso, pero no para otros; Además, se supone que la lista es modificable. Si esto es aceptable, estamos bien.Si no, uno podría crear una copia en orden inverso :
Este enfoque funciona, pero requiere iterar sobre la lista dos veces. El constructor de copia (
new ArrayList<>(list)
) itera sobre la lista, y también lo haceCollections.reverse
. Podemos reescribir este método para iterar solo una vez, si estamos tan inclinados:Esto es más eficiente, pero también más detallado.
Alternativamente, podemos reescribir lo anterior para usar la
stream
API de Java 8 , que algunas personas encuentran más concisa y legible que lo anterior:nótese bien. eso
Collectors.toList()
hace muy pocas garantías sobre la lista de resultados. Si desea asegurarse de que el resultado regrese como ArrayList, úselo en suCollectors.toCollection(ArrayList::new)
lugar.La tercera opción es crear una vista en orden inverso . Esta es una solución más complicada, y merece una lectura adicional / su propia pregunta. El método inverso de Listas de guayaba es un punto de partida viable.
La elección de una implementación "más simple" se deja como un ejercicio para el lector.
fuente
Solución sin usar ArrayList adicional o combinación de métodos add () y remove (). Ambos pueden tener un impacto negativo si tiene que revertir una lista enorme.
fuente
fuente
Invertir una ArrayList de forma recursiva y sin crear una nueva lista para agregar elementos:
fuente
En caso de que estemos usando Java 8 , podemos hacer uso de Stream. ArrayList es una lista de acceso aleatorio y podemos obtener una secuencia de elementos en orden inverso y luego recopilarla en una nueva
ArrayList
.El enfoque anterior no es adecuado para LinkedList ya que no es de acceso aleatorio. También podemos hacer uso de
instanceof
para comprobar también.fuente
También podemos hacer lo mismo con Java 8.
fuente
Un poco más legible :)
fuente
Otra solucion recursiva
fuente