Jaki jest najprostszy sposób na odwrócenie tej tablicy 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());
Nie najprostszy sposób, ale jeśli jesteś fanem rekurencji, możesz zainteresować się następującą metodą odwrócenia ArrayList:
Lub nierekurencyjnie:
źródło
int j
nie aktualizuje się przy każdej iteracji? Inicjalizujesz to,j = list.size() - 1
ale nie sądzę, że sekcja inicjalizacyjnafor loop
jest aktualizowana przy każdej iteracji, prawda?IndexOutOfBoundsException
skoro próbujesz uzyskać dostępj
(ostatni indeks oryginalnej ArrayList), ale już usunąłeś obiekt pod tym indeksem?add()
popycha pozostałe elementy w dół tablicy, więc tablica pozostaje zasadniczo stała. Ciekawe rozwiązania, dzięki!Sztuczka polega na zdefiniowaniu „odwrotności”. Można zmodyfikować listę w miejscu, utworzyć kopię w odwrotnej kolejności lub utworzyć widok w odwrotnej kolejności.
Najprostszym, intuicyjnie mówiąc , jest
Collections.reverse
:Ta metoda modyfikuje listę na miejscu . Oznacza to, że
Collections.reverse
pobiera listę i zastępuje jej elementy, nie pozostawiając żadnej nieodwróconej kopii. Jest to odpowiednie w niektórych przypadkach użycia, ale nie w innych; ponadto zakłada, że lista jest modyfikowalna. Jeśli jest to do zaakceptowania, jesteśmy dobrzy.Jeśli nie, można utworzyć kopię w odwrotnej kolejności :
To podejście działa, ale wymaga dwukrotnego iterowania listy. Konstruktor kopiowania (
new ArrayList<>(list)
) wykonuje iterację po liście, podobnie jakCollections.reverse
. Możemy przepisać tę metodę, aby iterować tylko raz, jeśli jesteśmy tak skłonni:Jest to bardziej wydajne, ale także bardziej szczegółowe.
Alternatywnie możemy przepisać powyższe, aby użyć
stream
interfejsu API języka Java 8 , które niektórzy uważają za bardziej zwięzłe i czytelne niż powyższe:nb. który
Collectors.toList()
sprawia, że bardzo niewiele gwarancji o liście wynikowej. Jeśli chcesz mieć pewność, że wynik wróci jako ArrayList, użyjCollectors.toCollection(ArrayList::new)
zamiast tego.Trzecią opcją jest utworzenie widoku w odwrotnej kolejności . Jest to bardziej skomplikowane rozwiązanie i warte dalszego czytania / własnego pytania. Guava za Listy # odwrotna metoda jest dobrym punktem wyjścia.
Wybór „najprostszej” implementacji pozostawia czytelnikowi ćwiczenie.
źródło
Rozwiązanie bez użycia dodatkowej ArrayList lub kombinacji metod add () i remove (). Oba mogą mieć negatywny wpływ, jeśli musisz odwrócić ogromną listę.
źródło
źródło
Odwracanie ArrayList w sposób rekurencyjny i bez tworzenia nowej listy do dodawania elementów:
źródło
Na wypadek, gdybyśmy korzystali z Java 8 , możemy skorzystać ze Stream. ArrayList jest listą o swobodnym dostępie i możemy pobrać strumień elementów w odwrotnej kolejności, a następnie zebrać go w nowy
ArrayList
.Powyższe podejście nie jest odpowiednie dla LinkedList, ponieważ nie jest to dostęp losowy. Możemy również użyć
instanceof
do sprawdzenia.źródło
To samo możemy zrobić, używając java 8.
źródło
Trochę bardziej czytelny :)
źródło
Kolejne rozwiązanie rekurencyjne
źródło