java iterator learn use iterators java with examples
În acest tutorial, vom afla despre Iteratorii din Java. Vom avea o discuție detaliată despre interfețele Iterator și ListIterator în Java:
Am explorat totul despre Java Collection Framework și diferitele sale interfețe și clase de sprijin într-unul din tutorialele noastre anterioare.
Când aveți o colecție, atunci doriți să accesați elementele sale, să adăugați / eliminați sau să procesați elementele. Pentru a face toate aceste procesări printr-un program Java, ar trebui să puteți parcurge colecția pe care o utilizați. Aici intervine iteratorul în imagine.
Ce veți învăța:
- Ce este un Iterator Java?
- Concluzie
Ce este un Iterator Java?
În Java, un Iterator este o construcție care este utilizată pentru a parcurge sau a păși prin colecție.
Pentru a utiliza un Iterator, trebuie să obțineți obiectul iterator folosind „ iterator () ” metoda interfeței de colectare. Java Iterator este o interfață cadru de colecție și face parte din pachetul „java.util”. Folosind Java Iterator puteți itera prin colecția de obiecte.
Interfața Java Iterator înlocuiește enumeratorul care a fost folosit mai devreme pentru a parcurge câteva colecții simple, cum ar fi vectori.
Diferențele majore dintre Java Iterator și Enumerator sunt:
- Îmbunătățire considerabilă a denumirilor metodelor.
- Puteți elimina elementele metodei din colecția care este parcursă utilizând un iterator.
În acest tutorial, vom discuta detaliile interfeței Iterator și a interfeței ListIterator care este o interfață bidirecțională.
Tipuri de iteratoare
- Enumerator
- Iterator
- ListIterator
Un Enumerator este rar folosit acum. Prin urmare, în seria noastră de tutoriale, ne vom concentra pe interfețele Iterator și ListIterator.
Interfață Iterator în Java
Interfața Iterator din Java face parte din cadrul Colecțiilor din pachetul „java.util” și este un cursor care poate fi folosit pentru a parcurge colecția de obiecte.
Interfața Iterator are următoarele caracteristici majore:
- Interfața Iterator este disponibilă din cadrul de colectare Java 1.2.
- Parcurge colecția de obiecte unul câte unul.
- Cunoscut popular ca „Cursor Java universal”, deoarece funcționează cu toate colecțiile.
- Această interfață acceptă operațiile de „citire” și „eliminare”, adică puteți elimina un element în timpul unei iterații folosind iteratorul.
Reprezentarea generală a interfeței Iterator este dată mai jos:
În continuare, să aruncăm o privire asupra metodelor Iterator enumerate mai sus.
Metode Iterator
Interfața Iterator acceptă următoarele metode:
# 1) Următorul ()
Prototip: E next ()
Parametri: fără parametri
Tipul de returnare: E -> element
Descriere: Returnează următorul element din colecție.
Dacă iterația (colecția) nu mai are elemente, atunci aruncă NoSuchElementException .
# 2) hasNext ()
Prototip: boolean hasNext ()
Parametri: ZERO
Tipul de returnare: adevărat => există elemente în colecție.
Fals => nu mai există elemente
Descriere: Funcția hasNext () verifică dacă există mai multe elemente în colecție care sunt accesate folosind un iterator. Dacă nu mai există elemente, atunci nu mai apelați metoda next (). Cu alte cuvinte, această funcție poate fi utilizată pentru a decide dacă urmează să fie apelată metoda next ().
# 3) elimina ()
Prototip: nul elimina ()
Parametri: ZERO
Tipul de returnare: ZERO
Descriere: Elimină ultimul element returnat de iterator iterând peste colecția subiacentă. Metoda remove () poate fi apelată o singură dată la următorul apel ().
Dacă iteratorul nu acceptă operația de eliminare, atunci aruncă UnSupportedOperationException . Aruncă IllegalStateException dacă următoarea metodă nu este încă apelată.
# 4) pentruEachRemaining ()
Prototip: nul pentru EachRemaining (consumator super ESTE > acțiune)
Parametri: actiune => actiune de executat
Tipul de returnare: nul
Descriere: Efectuează acțiunea specificată asupra fiecăruia dintre elementele rămase ale colecției până când toate elementele sunt epuizate sau acțiunea produce o excepție. Excepțiile aruncate prin acțiune sunt propagate către apelant.
Dacă acțiunea este nulă, atunci crește nullPointerException . Această funcție este o nouă adăugire la interfața Iterator în Java 8.
Exemplu Iterator Java
Să implementăm un program Java pentru a demonstra utilizarea interfeței Iterator. Următorul program creează o ArrayList de flori. Apoi obține un iterator folosind metoda iterator () din ArrayList. După aceea, lista este parcursă pentru a afișa fiecare element.
import java.util.*; public class Main { public static void main(String[] args) { List flowers = new ArrayList(); flowers.add('Rose'); flowers.add('Jasmine'); flowers.add('sunflower'); // Get Iterator IteratorflowersIterator = flowers.iterator(); System.out.println('Contents of ArrayList:'); // Traverse elements using iterator while(flowersIterator.hasNext()){ System.out.print(flowersIterator.next() + ' '); } } }
Ieșire:
Limitările interfeței Iterator
- Operația de înlocuire a unui element sau adăugarea unui element nou nu poate fi efectuată cu acest Iterator.
- Iterația se desfășoară numai într-o singură direcție, adică direcția înainte.
- Suportă doar iterații secvențiale.
- Când se vor itera volume mari de date, atunci performanța Iteratorului este afectată.
Iterator VsIterabil
Deși interfețele Iterable și Iterator sună similar, ele sunt complet diferite. O clasă care implementează interfața Iterable dobândește capacitatea de a itera peste obiectele clasei care utilizează interfața iteratorului.
Date mai jos sunt câteva dintre principalele diferențe dintre aceste două interfețe pe care trebuie să le cunoașteți:
Interfață iterabilă | Interfață Iterator |
---|---|
Reprezintă o colecție care poate fi parcursă folosind bucla foreach. | Permite repetarea unei alte colecții. |
Clasa care implementează interfața iterabilă trebuie să anuleze metoda iterator (). | Metodele hasNext () și next () ale interfeței Iterator trebuie să fie suprascrise de clasa care o implementează. |
Nu stochează starea curentă. | Stochează starea actuală de iterație. |
O instanță a interfeței iteratorului ar trebui să fie produsă de fiecare dată când se apelează metoda iterator (). | Nu există un astfel de contract pentru interfața iteratorului. |
Se deplasează numai în direcția înainte. | Se deplasează în direcția înainte și subinterfețe, cum ar fi listIterator, care suportă traversarea bidirecțională. |
Nu oferă nicio metodă de modificare a elementelor în timpul iterației. | Oferă metoda de eliminare care poate elimina elementul atunci când iterația este în desfășurare. |
Interfață ListIterator în Java
Interfața ListIterator este o subinterfață a interfeței iteratorului. Funcționează pe colecții de tipuri de liste precum Linkedlists, liste de matrice etc. Astfel această interfață depășește neajunsurile interfeței Iterator.
Principalele caracteristici ale interfeței ListIterator includ:
- Interfața ListIterator extinde interfața Iterator.
- Interfața ListIterator acceptă operații CRUD, adică Creați, Citiți, Actualizați și Ștergeți.
- Suportă iterația în direcția înainte și înapoi.
- Deoarece această interfață este bidirecțională, cursorul este întotdeauna poziționat între elementele anterioare și următoare.
- Această interfață funcționează în principal pentru implementări de liste precum ArrayList, LinkedList etc.
- Disponibil din Java 1.2
Interfața ListIterator este reprezentată după cum se arată mai jos:
După cum sa menționat deja, interfața ListIterator extinde interfața Iterator. Astfel, în afară de acceptarea tuturor metodelor de interfață iterator, așa cum este descris mai sus, interfața ListIterator are și metode proprii care îl ajută să efectueze operații CRUD, precum și iterații bidirecționale.
Să discutăm în detaliu metodele ListIterator.
Metode ListIterator
Rețineți că metodele interfeței Iterator, next (), hasNext () și remove () funcționează exact, în același mod, ca interfața ListIterator. Prin urmare, vom ignora aceste metode în această secțiune. În plus față de metodele menționate mai sus, ListIterator are următoarele metode-
Anterior()
Prototip: E precedent ()
Parametri: ZERO
Tipul de returnare:
E- elementul anterior din listă.
- 1 - dacă iteratorul se află la începutul listei.
Descriere: Această funcție returnează elementul anterior din listă. Odată ce elementul anterior este returnat, cursorul este mutat înapoi la elementul următor.
hasPrevious ()
Prototip: boolean arePrevious ()
Parametri: ZERO
Tipul de returnare: true => iteratorul are mai multe elemente atunci când lista este parcursă înapoi.
Descriere: Această funcție verifică dacă ListIterator are mai multe elemente în sens invers.
precedentIndex
Prototip: int precedentIndex ()
Parametri: ZERO
Tipul de returnare:
int - indexul elementului anterior
- 1 - dacă indicatorul se află la începutul listei.
Descriere: Returnează indexul elementului anterior care este returnat de apelul precedent ().
nextIndex
Prototip: int nextIndex ()
Parametri: ZERO
Tipul de returnare:
int - index următor
- 1 - dacă iteratorul se află la sfârșitul listei.
Descriere: Returnează următorul index al elementului din listă. Acest element este returnat printr-un apel către metoda next ().
a stabilit()
Prototip: set nul (E și)
Parametri: e - element de înlocuit
Tipul de returnare: ZERO
Descriere: Folosit pentru a înlocui ultimul element cu elementul dat e.
adăuga()
Prototip: adăugare nulă (E e)
Parametri: e - element de adăugat
Tipul de returnare: ZERO
Descriere: Adaugă elemente noi la listă într-o poziție înainte de cea a elementului next ().
Listă Iterator Exemplu
Acum, știm ce este un ListIterator și care sunt diferitele metode acceptate de acesta. Să mergem mai departe și să implementăm un program Java pentru a demonstra ListIterator.
În acest program, am folosit ArrayList. Apoi folosim metodele ListIterator pentru a parcurge lista în direcția înainte și înapoi și pentru a afișa ieșirea.
import java.util.*; class Main { public static void main(String args[]) { Listnum_list = new ArrayList(); // Add Elements to ArrayList num_list.add(1); num_list.add(3); num_list.add(5); num_list.add(7); num_list.add(9); // Creatinge a ListIterator ListIteratorlist_it = num_list.listIterator(); System.out.println('Output using forward iteration:'); while (list_it.hasNext()) System.out.print(list_it.next()+' ') ; System.out.print('
Output using backward iteration:
') ; while (list_it.hasPrevious()) System.out.print(list_it.previous()+' '); } }
Ieșire:
Până acum am discutat despre interfețe, iterator și Listiterator, apoi vom vedea diferitele exemple de utilizare a acestor interfețe pentru a traversa diferite colecții. Dar, mai întâi, să analizăm traversarea matricelor simple și apoi să trecem la alte colecții.
Array Iterator
În Java, există două moduri de a itera peste elementele matrice. Să descriem modalitățile folosind exemple de cod.
# 1) pentru buclă
Acesta este cel mai simplu mod de a itera pe o matrice. Folosim o buclă simplă pentru creșterea indexului cu fiecare iterație și afișarea conținutului acestuia.
import java.util.*; public class Main { public static void main(String[] args) { int myArray[] = {2,4,6,8,10,12,14}; int num; System.out.println('Array contents using for loop:'); for (int i = 0; i Ieșire:
Programul de mai sus afișează conținutul matricei folosind bucla for.
# 2) pentru fiecare buclă
Acesta este al doilea mod de a itera peste matrice. Aici folosim o buclă specializată pentru buclă sau „pentru fiecare”. Aici parcurgem matricea pentru fiecare element și apoi afișăm conținutul.
import java.util.*; public class Main { public static void main(String[] args) { int myArray[] = {2,4,6,8,10,12,14}; int num; System.out.println('Array contents using for each loop:'); for (int i :myArray) { // accessing each element of array num = i; System.out.print(num + ' '); } } }
Ieșire:
ForEach este mai optimizat în comparație cu bucla for. Este mai scurt de tastat și este și mai rapid.
ArrayList Iterator
În cazul în care doriți să parcurgeți o colecție ArrayList, puteți face acest lucru utilizând interfața Iterator. Deoarece iteratorul este o interfață, nu îl puteți instanția direct. În schimb, puteți utiliza metoda iterator () a colecției ArrayList pentru a obține iteratorul și apoi a parcurge lista.
Iterator iterator ();
Exemplu pentru a demonstra Iteratorul ArrayList.
import java.util.*; public class Main { public static void main(String[] args) { ArrayListmyList = new ArrayList(); myList.add('Red'); myList.add('Green'); myList.add('Blue'); myList.add('Brown'); myList.add('Pink'); myList.add('Purple'); Iteratorlist_it = myList.iterator(); System.out.println('Elements in the arrayList:'); while(list_it.hasNext()) System.out.print(list_it.next() + ' '); } }
Ieșire:
LinkedList Iterator
Acum, să vedem funcționalitatea unui iterator în cazul colecției LinkedList.
Colecția LinkedList acceptă metoda listIterator () care returnează listIterator pentru a traversa lista conectată.
Formatul general pentru această funcție este
ListIterator list_iter = LinkedList.listIterator (int index);
Aici, indexul este o valoare întreagă care specifică poziția din colecția de liste de link-uri de unde ar trebui să înceapă traversarea.
Să înțelegem iteratorul listei din lista legată cu un exemplu de program. Am modificat același program iterator de matrice și l-am schimbat pentru a conține un listiterator cu LinkedList.
import java.util.*; public class Main { public static void main(String[] args) { LinkedListmyList = new LinkedList(); myList.add('Red'); myList.add('Green'); myList.add('Blue'); myList.add('Brown'); myList.add('Pink'); myList.add('Purple'); ListIteratorlist_it = myList.listIterator(0); System.out.println('Elements in the LinkedList:'); while(list_it.hasNext()) System.out.print(list_it.next() + ' '); } }
Ieșire:
cum să configurați un e-mail fals
Java Map / Hashmap Iterator
Harta sau variațiile sale, cum ar fi hashmap, copac, etc. nu sunt colecții. Prin urmare, nu puteți utiliza direct metoda iteratorului pe ea. În schimb, ar trebui să iterați peste valorile de intrare cheie pentru a citi perechile cheie / valoare.
Deși puteți utiliza diverse metode, cum ar fi forEach, for loop etc. pentru a itera peste valorile hărții, utilizarea unui iterator pentru a itera prin valorile cheie este cea mai bună și eficientă metodă. În plus, puteți elimina intrări de pe hartă în timpul iterației folosind metoda de eliminare.
Exemplu de utilizare a Iteratorului cu HashMap.
import java.util.*; class Main { public static void main(String[] arg) { MapmyMap = new HashMap(); // enter name/url pair myMap.put(1, 'India'); myMap.put(2, 'Nepal'); myMap.put(3, 'Maldives'); myMap.put(4, 'SriLanka'); System.out.println(' SAARC Member Countries '); System.out.println(' KEY' + ' ' + ' COUNTRY' ); // using iterators Iteratormap_itr = myMap.entrySet().iterator(); while(map_itr.hasNext()) { Map.Entrymap_entry = map_itr.next(); System.out.println(' ' + map_entry.getKey() + ' ' + map_entry.getValue()); } } }
Ieșire:
În programul de mai sus, am definit o hartă cu chei întregi și valori de tip șir. Apoi definim un iterator peste hartă. Introduceți și afișați perechile cheie / valoare.
Java Set Iterator
Metoda iterator () a Java.util.set este utilizată pentru a obține iteratorul care returnează elementele din set în ordine aleatorie.
Iterator set_iterator = Set.iterator();
„Set_iterator” repetă diferitele elemente ale setului și returnează valorile lor.
În mod similar, setul hash conține, de asemenea, o funcție iterator care returnează un iterator ca un iterator set.
Iterator hashset_iterator = Hash_Set.iterator();
Dat mai jos este exemplul de programare pentru a demonstra iteratorul setat.
import java.util.*; public class Main { public static void main(String args[]) { HashSetsports_set = new HashSet(); sports_set.add('Hocky'); sports_set.add('Kabaddi'); sports_set.add('Football'); sports_set.add('Badminton'); sports_set.add('Cricket'); System.out.println('Sports HashSet: ' + sports_set); // Creating an iterator Iterator hashset_iter = sports_set.iterator(); // Displaying the values after iterating through the set System.out.println('
SportsSet iterator values:'); while (hashset_iter.hasNext()) { System.out.println(hashset_iter.next()); } } }
Ieșire:
Această implementare utilizează Iterator HashSet și afișează valori individuale iterând peste elementele HashSet.
Iterator vs ListIterator
Să tabelăm principalele diferențe dintre interfețele Iterator și ListIterator.
Iterator ListIterator Poate parcurge toate colecțiile, inclusiv set, hartă etc. Poate fi folosit pentru a parcurge doar colecția de tipuri de liste, cum ar fi ArrayList, LinkedList. Iterează colecția doar în direcția înainte. Poate itera peste colecție în direcția înainte și înapoi. Nu se pot obține indexuri. Poate obține indexuri. Nici o modalitate de a adăuga elemente noi la colecție. Puteți adăuga elemente noi la colecție. Iteratorul nu poate modifica elementele în timpul iterației. ListIterator poate modifica elementele din colecție folosind metoda set ().
întrebări frecvente
Q # 1) Ce este iterația în Java?
Răspuns: O iterație este un proces prin care un bloc de cod este executat în mod repetat până când o anumită condiție se menține sau nu există. Folosind iterația puteți parcurge o secvență de elemente sau puteți procesa datele.
Q # 2) Câte tipuri de iteratoare există în Java?
Răspuns: Iteratorii sunt folosiți pentru a parcurge colecțiile din Java.
Există trei tipuri de iteratori în Java:
- Enumeratori
- Iteratori
- ListIterators
Î # 3) Cum folosesc un Iterator în Java?
Răspuns: Pentru a utiliza iteratorul pentru a parcurge colecția, mai întâi, trebuie să obțineți iteratorul folosind metoda iterator () a colecției specificate.
Apoi puteți utiliza metodele hasNext () și next () ale iteratorului pentru a obține elementul.
Q # 4) De ce se folosește Iterator în loc de buclă?
Răspuns: Atât iteratorul, cât și bucla pentru este utilizat pentru a executa în mod repetat un anumit bloc de cod. Dar diferența principală este că în bucla for nu puteți modifica sau modifica conținutul colecției. Chiar dacă încercați să îl modificați, acesta va lansa concurrentModificationException. Folosind iteratorul puteți elimina un element din colecție.
Q # 5) De ce avem nevoie de Iterator în Java?
Răspuns: Iterator vă ajută să recuperați elementele din colecție sau dintr-un container fără ca programatorul să trebuiască să cunoască structura internă sau funcționarea colecției. Sunt mai elegante, consumă mai puțină memorie și, de asemenea, programatorul este scutit de scrierea unui cod lung.
În al doilea rând, elementele pot fi stocate în colecție în orice mod, dar folosind un iterator, programatorul le poate recupera la fel ca o listă sau orice altă secvență.
Concluzie
Am discutat iteratorii în Java care sunt folosiți cu colecțiile în acest tutorial. Această cunoaștere a iteratorilor îi va ajuta pe cititori să înțeleagă colecțiile pe care le vom învăța în tutorialele noastre ulterioare.
Lectură recomandată
- Interfață Java și tutorial de clasă abstractă cu exemple
- Tutorial JAVA pentru începători: peste 100 de cursuri video Java practice
- Implementarea Java: crearea și executarea fișierului Java JAR
- Cuvânt cheie Java „acest”: Tutorial cu exemple de cod
- Mașină virtuală Java: Cum ajută JVM la rularea aplicației Java
- Modificatori de acces în Java - Tutorial cu exemple
- Tutorial de reflecție Java cu exemple
- C ++ vs Java: Top 30 de diferențe între C ++ și Java cu exemple