Iterator - kłopoty z previous(), add(), remove() etc.

0

Mały problem z iteratorem. Chodzi o zastosowanie iteratora a dokładnie metody previous(), add(). Poniżej testowy przykład.


import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;

public class IteratorTEST {
public static void main(String []args){
ArrayList<String> alist = new ArrayList<String>();

	alist.add("aaaaa");
	alist.add("bbbbb");
	alist.add("ccccc");
	alist.add("ddddd");
	alist.add("eeeee");
	
	for (Iterator<String> it = alist.iterator(); it.hasNext();){
		String n = it.next();
		int i = it.nextIndex();		
		System.out.println(n + " " + i);
	}
	
	System.out.println("=====")
	for (Iterator<String> it = alist.iterator(); it.hasPrevious();){
		String p = it.previous();	
		int j = it.previousIndex();
		System.out.println(p + " " + j);
	}
	it.remove();	//?  chcialbym usunac pierwsza wartosc przypisana do p tj. aaaaa
	it.add();		//?  i w to miejsce wstawic np. zzzzz
}

}


Nie potrafię zapisać it.remove() oraz it.add() tak aby spełniały swoje funkcje (w komentarzach). Podobnie "int i = it.nextIndex();" nie podaje mi indeksu następnego a "int j = it.previousIndex();" poprzedniego. Próbowałem: i=it.nextIndex(n), j=it.previousIndex(p), i nic z tego. Eclipse daje mi informację że powinienem zrobić cast tj
((Object) it).nextIndex().

Dzięki za podpowiedzi !!!

0

Użyj listIterator() zamiast iterator().
Przykładowy kod:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;

public class IteratorTest 
{
    public static void main(String []args)
    {
        ArrayList<String> alist = new ArrayList<String>();
               
        alist.add("aaaaa");
        alist.add("bbbbb");
        alist.add("ccccc");
        alist.add("ddddd");
        alist.add("eeeee");
        
        ListIterator<String> it;         
        for (it = alist.listIterator(); it.hasNext();)
        {
            String n = it.next();
            int i = it.nextIndex();                
            System.out.println(n + " " + i);
        }           
        System.out.println("=====");
        for (;it.hasPrevious();)
        {
            String p = it.previous();        
            int j = it.previousIndex();
            System.out.println(p + " " + j);
        }
        it = alist.listIterator();
        it.next();
        it.remove();
        it.add("zzzzz");
        System.out.println("=====");
        for (it = alist.listIterator(); it.hasNext();)
        {
            String n = it.next();
            int i = it.nextIndex();                
            System.out.println(n + " " + i);
        }                        
    }
}

Umieszczaj kod w znacznikach <code class="java"></code>

0

Dzięki za poprawienie. Działa dobrze ale mam jeszcze pytanie jeśli chodzi o same działanie iteratora. Efekt poprawionego kodu wygląda tak:

aaaaa 1
bbbbb 2
...

eeeee 3
ddddd 2
....
aaaaa -1

...

Dla aaaaa mam indeks 1, natomiast dla eeeee 3 a dla aaaaa -1 jeśli jest użyte hasPrevious(). Dlaczego nie zaczynamy od indeksu 0 i kończymy na 4, a w przypadku wyliczania odwrotnego od 4 i koniec na 0 ? Czy chodzi o to że it.nextIndex() pomija indeks 0 a it.next() pobiera ciąg znaków aaaaa (tak jakby był to rodzaj opóźnienia). Jeśli chodzi o wyliczanie odwrotne to metody it.next(), it.remove(), it.add("zzzzz"); powoduja że numer indeksu jest przesunięty ale dlaczego zaczynamy wyliczanie przyjmując 3 dla eeeee a nie 4? Czy chodzi o to że podobnie jak z 0 metoda it.previousIndex() pomija 4 i zaczyna wyliczanie od 3 (włącznie). Dopiero dodanie -1 do it.next() powoduje rozpoczęcie od indeksu 0. Czy istnieje metoda która rozpoczyna liczenie od 0?

0

W przykładzie lista jest 5-elementowa, zatem indeksy są z zakresu [0-4]. Metoda nextIndex() zwraca indeks kolejnego elementu, a nie tego elementu na który "patrzy" iterator. Zatem w każdym stanie iteratora metoda nextIndex() zwraca liczbę o jeden większą niż aktualny indeks, tzn. liczbę z zakresu [1-5]. Analogicznie, previousIndex() zwraca liczbę o jeden mniejszą niż aktualny indeks.

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