ListIterator problem

0

Może od kodu zacznę:

public class Main{
    public static void main(String[] args) {
        List list = new ArrayList<String>();
        list.add("jeden");
        list.add("dwa");
        list.add("trzy");
        list.add("cztery");

        ListIterator<String> iterator = list.listIterator(2);
        System.out.println(iterator.next());
        System.out.println(iterator.next());
        System.out.println(iterator.previous());
        System.out.println(iterator.previous());
        System.out.println(iterator.previous());
        System.out.println(iterator.next());
        System.out.println(iterator.next());
    }
}

A tutaj output:

trzy
cztery
cztery
trzy
dwa
dwa
trzy

Nie wiem dlaczego tak się dzieje, i czy można użyć innego typu (albo opakować jakoś istniejący) żeby nieduplikowały się wartości z iteratora?

0

Wynik jest poprawny. Zaczynasz od pozycji 2 (lista liczona od 0) i lecąc iteracjami przód ->przód -> 3x tył ->2x przód prawidłowo pokazuje wynik.

0

Opakowałem to w klasę gdzie sprawdzam kierunek listy (jeśli kierunek się zmienia wywołuje analogicznie previous lub next 2 razy), może jest jakaś wbudowana klasa w Javie która do tego służy?

1

Dlaczego tak się dzieje? Opisuje to dokumentacja: https://docs.oracle.com/javase/7/docs/api/java/util/ListIterator.html

Wydaje mi się, że nie ma nic wbudowanego. Ja bym trzymał po prostu indeks w tablicy i zwiększał go lub zmniejszał o 1. Ale Twój pomysł ze zmianą kierunku i 2x jest dobry. Mając swoją klasę do przesuwania będziesz mógł w przyszłości zmienić jej implementację, np. na zwykłe trzymanie indeksu.

Pamiętaj, że ArrayList obsługuje RandomAccess (szybki dostęp do elementu znając jego index), a LinkedList - nie. Za to LinkedList pozwala wydajnie dodawać i usuwać elementy ze środka listy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1