Iteratori
Unul dintre metodele cheie ale interfeței Collection este metoda Iterator<E> iterator(), care returnează un iterator – un obiect care implementează interfața Iterator.
Interfața Iterator are următoarea structură:
public interface Iterator<E> {
E next();
boolean hasNext();
void remove();
}
Implementarea interfeței Iterator presupune următoarele:
- Metoda next() returnează următorul element din colecție
- Metoda hasNext() verifică dacă există un alt element în colecție și returnează true dacă există, sau false dacă am ajuns la finalul colecției
- Metoda remove() șterge ultimul element returnat de next()
Metoda hasNext() trebuie apelată înainte de next(), deoarece dacă se ajunge la finalul colecției și se apelează next() fără a verifica, se va arunca o excepție NoSuchElementException. De asemenea, remove() poate fi apelată doar după next().
Exemplu de utilizare a unui iterator pentru a parcurge o colecție ArrayList:
import java.util.*;
public class Program {
public static void main(String[] args) {
ArrayList<String> states = new ArrayList<String>();
states.add("Germany");
states.add("France");
states.add("Italy");
states.add("Spain");
Iterator<String> iter = states.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
}
}
Interfața ListIterator
Interfața Iterator oferă un set limitat de funcționalități. O interfață mai avansată este ListIterator, utilizată de clase care implementează interfața List, precum LinkedList sau ArrayList. ListIterator extinde Iterator și adaugă metode suplimentare:
- void add(E obj): inserează obiectul obj înaintea următorului element returnat de next()
- boolean hasNext(): verifică dacă există un element următor și returnează true dacă există
- boolean hasPrevious(): verifică dacă există un element anterior și returnează true dacă există
- E next(): returnează elementul curent și trece la următorul
- E previous(): returnează elementul curent și trece la anteriorul
- int nextIndex(): returnează indexul următorului element. Dacă nu există un astfel de element, returnează dimensiunea listei
- int previousIndex(): returnează indexul elementului anterior. Dacă nu există un astfel de element, returnează -1
- void remove(): șterge elementul curent din listă (poate fi apelată doar după next() sau previous())
- void set(E obj): înlocuiește elementul curent cu obiectul obj
Exemplu de utilizare a unui ListIterator:
import java.util.*;
public class Program {
public static void main(String[] args) {
ArrayList<String> states = new ArrayList<String>();
states.add("Germany");
states.add("France");
states.add("Italy");
states.add("Spain");
ListIterator<String> listIter = states.listIterator();
while(listIter.hasNext()){
System.out.println(listIter.next());
}
// acum elementul curent este "Spain"
// modificăm valoarea acestui element
listIter.set("Portugal");
// parcurgem elementele în ordine inversă
while(listIter.hasPrevious()){
System.out.println(listIter.previous());
}
}
}
Explicații:
Iterator este utilizat pentru a parcurge colecții și oferă metode de bază, cum ar fi next(), hasNext() și remove(). ListIterator extinde Iterator și permite atât navigarea înainte, cât și înapoi prin listă, modificarea și adăugarea de elemente la poziții specifice.