Muszę przejrzeć listę w odwrotnej kolejności, używając języka Java.
Więc gdzie to robi do przodu:
for(String string: stringList){
//...do something
}
Czy istnieje sposób na iterację stringList w odwrotnej kolejności przy użyciu for each syntax?
Dla jasności: wiem, jak powtórzyć listę w odwrotnej kolejności, ale chciałbym wiedzieć (ze względu na ciekawość), jak to zrobić w każdym stylu.
Set
kolekcji pochodnych.foreach
gwarantuje iterację w kolejności iteratora zwróconej ziterator()
metody kolekcji. docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.htmlOdpowiedzi:
Metoda Collections.reverse w rzeczywistości zwraca nową listę z elementami oryginalnej listy skopiowanymi do niej w odwrotnej kolejności, dzięki czemu uzyskuje się wydajność O (n) w odniesieniu do rozmiaru oryginalnej listy.
Bardziej wydajnym rozwiązaniem jest napisanie dekoratora, który prezentuje odwrócony widok listy jako iterowalnej. Iterator zwrócony przez dekoratora użyje elementu ListIterator listy dekorowanej, aby przejść przez elementy w odwrotnej kolejności.
Na przykład:
Używałbyś go tak:
źródło
Aby uzyskać listę, możesz skorzystać z biblioteki Google Guava :
Zauważ, że nie odwraca całej kolekcji ani nie robi czegoś podobnego - po prostu umożliwia iterację i losowy dostęp w odwrotnej kolejności. Jest to bardziej wydajne niż najpierw odwracanie kolekcji.
Lists.reverse
Aby odwrócić dowolną iterację, musiałbyś przeczytać wszystko, a następnie „odtworzyć” to wstecz.
(Jeśli nie masz już go używać, ja dokładnie polecam rzucić okiem na guawa . To świetna sprawa).
źródło
Lista (w przeciwieństwie do zestawu) jest uporządkowaną kolekcją i iteracja po niej zachowuje kolejność według kontraktu. Spodziewałbym się, że stos będzie iterował w odwrotnej kolejności, ale niestety tak nie jest. Najprostszym rozwiązaniem, jakie przychodzi mi do głowy, jest to:
Zdaję sobie sprawę, że nie jest to rozwiązanie pętli „dla każdego”. Wolę używać pętli for niż wprowadzać nową bibliotekę, taką jak Kolekcje Google.
Collections.reverse () również wykonuje to zadanie, ale aktualizuje listę w przeciwieństwie do zwracania kopii w odwrotnej kolejności.
źródło
for each
składnięSpowoduje to zepsucie oryginalnej listy i musi być wywoływane poza pętlą. Nie chcesz również wykonywać odwrotności za każdym razem, gdy wykonujesz pętlę - czy byłoby to prawdą, gdyby jeden z nich
Iterables.reverse ideas
został zastosowany?źródło
AFAIK, w standardowej bibliotece nie ma standardowego typu „reverse_iterator”, który obsługuje składnię for-each, która jest już cukrem składniowym, który wprowadzili późno do języka.
Możesz zrobić coś takiego jak (element pozycji: myList.clone (). Reverse ()) i zapłacić odpowiednią cenę.
Wydaje się to również dość zgodne z widocznym zjawiskiem polegającym na braku wygodnych sposobów wykonywania kosztownych operacji - ponieważ lista z definicji może mieć złożoność dostępu swobodnego O (N) (można zaimplementować interfejs z pojedynczym łączem), odwrotnie iteracja może zakończyć się O (N ^ 2). Oczywiście, jeśli masz ArrayList, nie płacisz tej ceny.
źródło
To może być opcja. Mam nadzieję, że jest lepszy sposób na rozpoczęcie od ostatniego elementu niż pętla while do końca.
źródło
Od komentarza : Powinieneś być w stanie korzystać z Apache Commons
ReverseListIterator
Jak powiedział @rogerdpack , musisz opakować
ReverseListIterator
plik jakoIterable
.źródło
Nie bez napisania niestandardowego kodu, który da ci moduł wyliczający, który odwróci elementy za Ciebie.
Powinieneś móc to zrobić w Javie, tworząc niestandardową implementację Iterable, która zwróci elementy w odwrotnej kolejności.
Następnie należy utworzyć instancję opakowania (lub wywołać metodę what-have-you), która zwróci Iterowalną implementację, która odwraca element w pętli for.
źródło
Możesz użyć klasy Kolekcje http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html, aby odwrócić listę, a następnie zapętlić.
źródło
Będziesz musiał odwrócić swoją kolekcję, jeśli chcesz użyć dla każdej składni po wyjęciu z pudełka i postępować w odwrotnej kolejności.
źródło
Wszystkie powyższe odpowiedzi spełniają tylko to wymaganie, albo zawijając inną metodę, albo wywołując jakiś obcy kod na zewnątrz;
Oto rozwiązanie skopiowane z wydania Thinking in Java 4 , rozdział 11.13.1 AdapterMethodIdiom ;
Oto kod:
źródło
int current = size() - 1
rację? dlaczego nieint current = this.size() - 1
orint current = super.size() - 1
Praca wokół:
Lub z guawą :
źródło
Zdecydowanie późna odpowiedź na to pytanie. Jedną z możliwości jest użycie elementu ListIterator w pętli for. Nie jest tak czysty, jak składnia dwukropka, ale działa.
Kredyt za składnię ListIterator przypada na „Sposoby iteracji listy w Javie”
źródło