Mam listę właściwości, która musi wielokrotnie powtarzać iterację. Używam go do śledzenia serii stron w przepływie pracy, który zostanie utworzony dynamicznie. To nie zachowuje się tak, jak bym się spodziewał. Biorąc pod uwagę ten przykład:Używanie ListIterator do przechodzenia w przód iw tył przez obiekt LinkedList w Javie
LinkedList<String> navigationCases;
navigationCases.add("page1");
navigationCases.add("page2");
navigationCases.add("page3");
navigationCases.add("page4");
ListIterator navigationItr = navigationCases.listIterator();
navigationItr.next(); // Returns page1
navigationItr.next(); // Returns page2
navigationItr.previous(); //Returns page2 again
navigationItr.next(); //Returns page2 again
Myślałem, że może ja budowałem moją listę nieprawidłowo lub przy użyciu iteracyjnej złego, ale po przeczytaniu dokumentacji, to wydaje się być zgodne z projektem:
ListIterator nie ma prądu element; jego pozycja kursora zawsze leży między elementem, który zostanie zwrócony przez wywołanie poprzedniego() i elementem, który zostanie zwrócony przez wywołanie next().
I:
(Next) Zwraca następny element na liście. Ta metoda może być wielokrotnie wywoływana w celu iteracji na liście lub wymieszania z wywołaniami poprzednich w celu powrócenia do poprzedniej. (Zwróć uwagę, że naprzemienne wywoływanie do następnego i poprzedniego spowoduje wielokrotne zwracanie tego samego elementu).
Po przeczytaniu tego, jest jasne, dlaczego mój kod zachowuje się w taki sposób. Po prostu nie rozumiem, dlaczego to powinno działać w ten sposób. Nawet usunięcie wydaje się odgiąć w tył, aby pomieścić tę implementację:
Należy zauważyć, że metody remove() i set (Object) nie są zdefiniowane pod względem położenia kursora; są zdefiniowane tak, aby działały na ostatnim elemencie zwróconym przez wywołanie next() lub previous().
Koncepcyjnie, LinkedList wydawało się modelować moje przypadki przepływu pracy całkiem dobrze, ale nie mogę używać Iteratora, który zachowuje się w ten sposób. Czy tu coś pomijam, czy powinienem napisać własną klasę, utrzymywać listę przypadków i poruszać się po nich?
Dlaczego nie możesz "użyć iteratora, który zachowuje się w ten sposób"? Reszta świata ma. Po prostu zaakceptuj, jak działa i wykorzystaj go tak, jak zamierzano go użyć. – Madbreaks
Zachowuje się w ten sposób, ponieważ wykonuje iterację i usuwanie rozpoczynając od pracy końcowej dokładnie tak samo, jak iterowanie i usuwanie, zaczynając od początku. –
@Madbreaks W jaki sposób ten przypadek użycia różni się od sposobu, w jaki był "przeznaczony do użycia"? Jak mogę uwzględnić "specjalny" przypadek pytania o poprzedni element natychmiast po otrzymaniu prośby o następny? Lub pytając o następny zaraz po zapytaniu o poprzednie? – user1535568