Chcę mieć odwrócony widok listy na liście (w podobny sposób, jak List#sublist
zapewnia widok listy sublist na liście). Czy jest jakaś funkcja zapewniająca tę funkcjonalność?
Nie chcę tworzyć żadnej kopii listy ani modyfikować listy.
Wystarczyłoby, gdybym w tym przypadku znalazł przynajmniej jedną iterator do tyłu.
Wiem też, jak to zrobić. Pytam tylko, czy Java już zapewnia coś takiego.
Wdrożenie demonstracyjne:
static <T> Iterable<T> iterableReverseList(final List<T> l) {
return new Iterable<T>() {
public Iterator<T> iterator() {
return new Iterator<T>() {
ListIterator<T> listIter = l.listIterator(l.size());
public boolean hasNext() { return listIter.hasPrevious(); }
public T next() { return listIter.previous(); }
public void remove() { listIter.remove(); }
};
}
};
}
Właśnie dowiedziałem się, że niektóre List
wdrożenia mają descendingIterator()
to, czego potrzebuję. Chociaż nie ma takiej ogólnej implementacji List
. Co jest dość dziwne, ponieważ implementacja, którą widziałem, LinkedList
jest wystarczająco ogólna, aby z nią pracować List
.
Collections.reverse(list)
Odpowiedzi:
Guava zapewnia to: Lists.reverse (List)
W przeciwieństwie do
Collections.reverse
tego jest to wyłącznie widok ... nie zmienia kolejności elementów na oryginalnej liście. Ponadto w przypadku modyfikowalnej oryginalnej listy zmiany zarówno pierwotnej listy, jak i widoku znajdują odzwierciedlenie w drugiej.źródło
List
), ale bez metody odwrotnej. usunięcie go sprawiło, że guawa znów była dostępna.ListIterator.previous()
Użyj metody .clone () na swojej liście. Zwróci płytką kopię, co oznacza, że będzie zawierała wskaźniki do tych samych obiektów, więc nie będziesz musiał kopiować listy. Następnie skorzystaj z kolekcji.
Ergo
Jeśli używasz
List
i nie masz dostępuclone()
, możesz użyćsubList()
:źródło
clone()
normalnie tworzyłby kopię listy. ZresztąList#clone()
też nie istnieje.clone()
. Rzeczywiście robi pełną kopię listy (nie klonuje tylko każdego obiektu na liście, ale o tym nigdy nie mówiłem).subList
nie kopiuje, po prostu zapewnia widok na liście bazowej, dlatego odwrócenie tego widoku spowoduje odwrócenie listy bazowej.Jeśli dobrze zrozumiałem, to jest to jeden wiersz kodu. To zadziałało dla mnie.
źródło
Nie jest do końca elegancki, ale jeśli użyjesz List.listIterator (int index), możesz uzyskać dwukierunkowy ListIterator na końcu listy:
źródło
Collections.reverse (nums) ... Faktycznie odwraca kolejność elementów. Poniższy kod należy docenić -
Wyjście: 15,94,83,42,61
źródło
java.util.Deque
madescendingIterator()
- jeśliList
jestDeque
, można użyć.źródło
Wiem, że to stary post, ale dzisiaj szukałem czegoś takiego. Na koniec sam napisałem kod:
Niezalecane w przypadku długich list, nie jest to wcale zoptymalizowane. Jest to dość łatwe rozwiązanie dla kontrolowanych scenariuszy (obsługiwane przez mnie Listy zawierają nie więcej niż 100 elementów).
Mam nadzieję, że to komuś pomoże.
źródło
Używam tego:
lubię to:
źródło
Możesz także to zrobić:
źródło
Możesz także odwrócić pozycję, gdy zażądasz obiektu:
źródło
W przypadku małej listy możemy utworzyć,
LinkedList
a następnie użyć iteratora malejącego jako:źródło
Użyj
reverse(...)
metodjava.util.Collections
klasy. Przekaż listę jako parametr, a lista zostanie odwrócona.źródło