logo

Iteradors en Java

Un cursor Java és un iterador, que s'utilitza per iterar o recórrer o recuperar els elements d'un objecte de col·lecció o flux un per un. En aquest article, aprendrem sobre els iteradors de Java i el seu funcionament.

Cursors Java

Tipus de cursors en Java

N'hi ha tres cursors a Java com s'esmenta a continuació:

  1. Iterador
  2. Enumeració
  3. ListIterator

Nota: SplitIterator també es pot considerar com un cursor, ja que només és un tipus d'iterador.



1. Iterador

Els iteradors en Java s'utilitzen en el Marc de la col·lecció per recuperar els elements un per un. És un universal iterador ja que el podem aplicar a qualsevol objecte Col·lecció. Utilitzant Iterator, podem realitzar tant operacions de lectura com d'eliminació. És una versió millorada d'enumeració amb la funcionalitat addicional d'eliminar un element.

L'iterador s'ha d'utilitzar sempre que volem enumerar elements a totes les interfícies implementades del marc de col·lecció com ara Set, List, Queue, Deque i totes les classes implementades de la interfície Map. L'iterador és el només cursor disponible per a tot el marc de la col·lecció. Es pot crear un objecte iterador cridant a iterador() mètode present a la interfície de Col·lecció.

Sintaxi

Iterator itr = c.  iterator  ();>

Nota: Aquí c és qualsevol objecte de col·lecció. itr és de tipus interfície Iterator i fa referència a c.

processament paral·lel

Mètodes de la interfície iteradora en Java

La interfície de l'iterador defineix tres mètodes que s'indiquen a continuació:

1. hasNext(): Retorna true si la iteració té més elements.

public boolean hasNext();>

2. següent(): Retorna el següent element de la iteració. Es tira NoSuchElementException si no hi ha més element present.

public Object next();>

3. eliminar(): Elimina el següent element de la iteració. Aquest mètode només es pot cridar una vegada per trucada a next().

public void remove();>

Nota: eliminar () El mètode pot llançar dues excepcions, a saber, de la següent manera:

  • UnsupportedOperationException : Si l'operació d'eliminació no és compatible amb aquest iterador
  • IllegalStateException : Si encara no s'ha cridat el mètode següent, o si ja s'ha cridat el mètode d'eliminació després de l'última crida al mètode següent.

Com funciona l'iterador de Java internament?

En aquesta secció, intentarem entendre com funcionen internament Java Iterator i els seus mètodes. Prenem el següent objecte LinkedList per entendre aquesta funcionalitat.

List cities = new LinkedList();  cities.add('G-1');  cities.add('G-2');  cities.add('G-3');  .  .  .  cities.add('G-n');>

Ara, creem un objecte Iterator a l'objecte Llista tal com es mostra a continuació:

Iterator citiesIterator = cities.iterator();>

L'iterador citiesIteartor tindrà aquest aspecte:

Iterador de Java Pas 1

Aquí el cursor de l'iterador apunta abans del primer element de la llista.

Ara, executarem el següent fragment de codi.

citiesIterator.hasNext(); citiesIterator.next();>
Java Iterator Pas 2

Quan executem el fragment de codi anterior, el cursor d'Iterator apunta al primer element de la llista, tal com es mostra al diagrama anterior.

variables de tipus java

Ara, executarem el següent fragment de codi.

citiesIterator.hasNext(); citiesIterator.next();>
Java Iterator Pas 3

Quan executem el fragment de codi anterior, el cursor d'Iterator apunta al segon element de la llista, tal com es mostra al diagrama anterior. Feu aquest procés per arribar al cursor de l'iterador fins a l'element final de la llista.

Pas de l'iterador de Java n

Després de llegir l'element final, si executem el fragment de codi següent, retorna un valor fals.

citiesIterator.hasNext();>
Iterador de Java al final

Com que el cursor de l'iterador apunta a l'element final de la llista, el mètode hasNext() retorna un valor fals.

Nota: Després d'observar tots aquests diagrames, podem dir que Java Iterator només admet la iteració de direcció cap endavant, tal com es mostra al diagrama següent. Així que també es coneix com a cursor unidireccional.

Funcionament de Java Iterator

Exemple

Java
// Java program to Demonstrate Iterator // Importing ArrayList and Iterator classes // from java.util package import java.util.ArrayList; import java.util.Iterator; // Main class public class Test { // Main driver method public static void main(String[] args) { // Creating an ArrayList class object // Declaring object of integer type ArrayList al = nova ArrayList (); // Iterant sobre la llista per a (int i = 0; i< 10; i++) al.add(i); // Printing the elements in the List System.out.println(al); // At the beginning itr(cursor) will point to // index just before the first element in al Iterator itr = al.iterator(); // Comprovació del següent element on // la condició es compleix fins que hi ha un sol element // a la llista utilitzant el mètode hasnext() mentre (itr.hasNext()) { // Mou el cursor al següent element int i = itr.next( ); // Obtenint elements un per un System.out.print(i + ' '); // Eliminació d'elements senars if (i % 2 != 0) itr.remove(); } // Ordre per a la línia següent System.out.println(); // Imprimint els elements dins de l'objecte System.out.println(al); } }>>>  
Sortida
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 0 1 2 3 4 5 6 7 8 9 [0, 2, 4, 6, 8]>

SplitIterator

Els divisors, com altres iteradors, serveixen per recórrer els elements d'una font. Una font pot ser a Col · lecció , un canal d'E/S o una funció de generador. S'inclou a JDK 8 per donar suport a un recorregut paral·lel eficient (programació paral·lela) a més del recorregut seqüencial. La interfície Java Spliterator és un iterador intern que divideix el flux en parts més petites. Aquestes peces més petites es poden processar en paral·lel.

Nota: A la programació de la vida real, potser mai hauríem d'utilitzar Spliterator directament. En operacions normals, es comportarà exactament igual que Java Iterator.

Avantatges de Java Iterator

  • El podem utilitzar per a qualsevol classe de Col·lecció.
  • Admet les operacions READ i REMOVE.
  • És un cursor universal per a l'API de col·lecció.
  • Els noms dels mètodes són senzills i fàcils d'utilitzar.

Limitacions de Java Iterator

A més, hi ha certes limitacions d'Iterator que s'enumeren a continuació:

  • A les operacions CRUD, NO admet les operacions CREATE i UPDATE.
  • Només admet la iteració de direcció cap endavant que és un iterador unidireccional.
  • En comparació amb Spliterator, NO admet elements d'iteració paral·lels, el que significa que només admet la iteració seqüencial.
  • En comparació amb Spliterator, NO admet un millor rendiment per repetir grans volums de dades.

2. Enumeració

És una interfície que s'utilitza per obtenir elements de col·leccions heretades (Vector, Hashtable). L'enumeració és el primer iterador present de JDK 1.0, les restes s'inclouen a JDK 1.2 amb més funcionalitat. Les enumeracions també s'utilitzen per especificar els fluxos d'entrada a a SequenceInputStream . Podem crear un objecte Enumeració cridant elements () mètode de la classe vectorial en qualsevol objecte vectorial

Sintaxi

N'hi ha dos mètodes a la interfície d'enumeració, a saber:

1. booleà públic hasMoreElements(): Aquest mètode prova si aquesta enumeració conté més elements o no.

2. Public Object nextElement(): Aquest mètode retorna el següent element d'aquesta enumeració. Llança NoSuchElementException si no hi ha més element present

Exemple

Java
// Java program to demonstrate Enumeration // Importing Enumeration and Vector classes // from java.util package import java.util.Enumeration; import java.util.Vector; // Main class public class Test { // Main driver method public static void main(String[] args) { // Creating a vector object Vector v = new Vector(); // Iterating over vector object for (int i = 0; i < 10; i++) v.addElement(i); // Printing elements in vector object System.out.println(v); // At beginning e(cursor) will point to // index just before the first element in v Enumeration e = v.elements(); // Checking the next element availability where // condition holds true till there is a single // element // remaining in the List while (e.hasMoreElements()) { // Moving cursor to next element int i = (Integer)e.nextElement(); // Print above elements in object System.out.print(i + ' '); } } }>

Sortida
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 0 1 2 3 4 5 6 7 8 9>

Hi ha certes limitacions de l'enumeració que són les següents:

  • L'enumeració és per llegat classes (Vector, Hashtable) només. Per tant, no és un iterador universal.
  • Les operacions d'eliminació no es poden realitzar mitjançant l'enumeració.
  • Només és possible la iteració cap endavant.

Similituds entre l'enumeració de Java i l'iterador

  • Tots dos són Cursors Java.
  • Tots dos s'utilitzen per iterar una col·lecció d'elements d'objectes un per un.
  • Tots dos admeten l'operació READ o Retrieval.
  • Tots dos són cursors Java unidireccionals, el que significa que només admeten la iteració de direcció cap endavant.

Diferències entre l'enumeració de Java i l'iterador

La taula següent descriu les diferències entre l'enumeració Java i l'iterador:

EnumeracióIterador
Introduït a Java 1.0Introduït a Java 1.2
Interfície heretadaNo és una interfície heretada
S'utilitza per repetir només les classes de la col·lecció heretada.El podem utilitzar per a qualsevol classe de Col·lecció.
Només admet l'operació READ.Admet les operacions READ i DELETE.
No és un cursor universal.És un cursor universal.
Noms del mètode llarg.Noms de mètodes senzills i fàcils d'utilitzar.

3. ListIterator

Només s'aplica a classes implementades amb la col·lecció List com ArrayList, LinkedList, etc. Proporciona una iteració bidireccional. ListIterator s'ha d'utilitzar quan volem enumerar elements de List. Aquest cursor té més funcionalitats (mètodes) que l'iterador. L'objecte ListIterator es pot crear cridant listIterator() mètode present a la interfície de llista.

Sintaxi

ListIterator ltr = l.  listIterator  ();>

Nota: Aquí l és qualsevol objecte List, ltr és de tipus. Interfície ListIterator i fa referència a l. La interfície ListIterator amplia la interfície Iterator. Així, els tres mètodes de la interfície Iterator estan disponibles per a ListIterator. A més, n'hi ha sis més mètodes.

1. Direcció endavant

1.1 hasNext(): Retorna true si la iteració té més elements

public boolean hasNext();>

1.2 següent(): Igual que el mètode next() de Iterator. Retorna el següent element de la iteració.

public Object next();>

1.3 nextIndex(): Retorna l'índex d'element següent o la mida de la llista si l'iterador de llista es troba al final de la llista.

public int nextIndex();>

2. Direcció enrere

2.1 hasPrevious(): Retorna true si la iteració té més elements mentre es recorre cap enrere.

public boolean hasPrevious();>

2.2 anterior(): Retorna l'element anterior a la iteració i pot llançar NoSuchElementException si no hi ha més element present.

public Object previous();>

2.3 Índex anterior(): Retorna l'índex d'element anterior o -1 si l'iterador de llista es troba al principi de la llista,

alfabet amb nombres
public int previousIndex();>

3. Altres Mètodes

3.1 elimina (): Igual que el mètode remove() de Iterator. Elimina el següent element de la iteració.

public void remove();>

3.2 conjunt (objecte objecte): Substitueix l'últim element retornat per next() o previous() amb l'element especificat.

public void set(Object obj);>

3.3 afegir(Objecte objecte): Insereix l'element especificat a la llista a la posició anterior a l'element que tornaria next()

public void add(Object obj);>

Clarament, els tres mètodes que ListIterator hereta de Iterator ( hasNext() , Pròxim() , i eliminar () ) fan exactament el mateix a les dues interfícies. El té l'anterior () i les operacions anteriors són anàlegs exactes de hasNext() i Pròxim() . Les primeres operacions fan referència a l'element abans del cursor (implícit), mentre que les darreres es refereixen a l'element després del cursor. L'operació anterior mou el cursor cap enrere, mentre que la següent el mou cap endavant.

ListIterator no té cap element actual; la seva posició del cursor sempre es troba entre l'element que retornaria per una crida a anterior () i l'element que es retornaria per una trucada a Pròxim().

1. conjunt () mètode pot llançar 4 excepcions.

  • UnsupportedOperationException: si l'operació de conjunt no és compatible amb aquest iterador de llista
  • ClassCastException: Si la classe de l'element especificat impedeix que s'afegeixi a aquesta llista
  • IllegalArgumentException: Si algun aspecte de l'element especificat impedeix que s'afegeixi a aquesta llista
  • IllegalStateException: Si no s'ha trucat ni el següent ni l'anterior, ni s'han cridat a eliminar o afegir després de l'última trucada a següent o anterior

2. afegir() mètode pot llançar 3 excepcions.

  • UnsupportedOperationException: Si el mètode d'afegir no és compatible amb aquest iterador de llista
  • ClassCastException: Si la classe de l'element especificat impedeix que s'afegeixi a aquesta llista
  • IllegalArgumentException: Si algun aspecte d'aquest element impedeix que s'afegeixi a aquesta llista

Exemple

Java
// Java program to demonstrate ListIterator // Importing ArrayList and List iterator classes // from java.util package import java.util.ArrayList; import java.util.ListIterator; // Main class public class Test { // Main driver method public static void main(String[] args) { // Creating an object of ArrayList class ArrayList al = new ArrayList(); // Iterating over Arraylist object for (int i = 0; i < 10; i++) // Adding elements to the Arraylist object al.add(i); // Print and display all elements inside object // created above System.out.println(al); // At beginning ltr(cursor) will point to // index just before the first element in al ListIterator ltr = al.listIterator(); // Checking the next element availability while (ltr.hasNext()) { // Moving cursor to next element int i = (Integer)ltr.next(); // Getting even elements one by one System.out.print(i + ' '); // Changing even numbers to odd and // adding modified number again in // iterator if (i % 2 == 0) { // Change to odd i++; // Set method to change value ltr.set(i); // To add ltr.add(i); } } // Print and display statements System.out.println(); System.out.println(al); } }>

Sortida
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 0 1 2 3 4 5 6 7 8 9 [1, 1, 1, 3, 3, 3, 5, 5, 5, 7, 7, 7, 9, 9, 9]>

Nota: De la mateixa manera, hi ha certes limitacions amb ListIterator . És l'iterador més potent, però només és aplicable a les classes implementades per List, de manera que no és un iterador universal.

Punts importants

  1. Tingueu en compte que inicialment, qualsevol referència d'iterador apuntarà a l'índex just abans de l'índex del primer element d'una col·lecció.
  2. No creem objectes d'Enumeration, Iterator, ListIterator perquè són interfícies. Utilitzem mètodes com elements(), iterator(), listIterator() per crear objectes. Aquests mètodes tenen un anònim Classe interior que amplia les interfícies respectives i retorna aquest objecte de classe.

Nota: El $ El símbol del nom de classe de referència és una prova que s'utilitza el concepte de classes internes i que es creen aquests objectes de classe.

multiplexació

Això es pot verificar amb el codi següent. Per obtenir més informació sobre la classe interna, consulteu

Java
// Java program to demonstrate iterators references // Importing required classes from java.util package import java.util.Enumeration; import java.util.Iterator; import java.util.ListIterator; import java.util.Vector; // Main class public class GFG { // Main driver method public static void main(String[] args) { // Creating an object of Vector class Vector v = new Vector(); // Creating three iterators Enumeration e = v.elements(); Iterator itr = v.iterator(); ListIterator ltr = v.listIterator(); // Print class names of iterators // using getClass() and getName() methods System.out.println(e.getClass().getName()); System.out.println(itr.getClass().getName()); System.out.println(ltr.getClass().getName()); } }>

Sortida
java.util.Vector java.util.Vector$Itr java.util.Vector$ListItr>

Explicació

A Java, un iterador és una interfície que s'utilitza per recórrer una col·lecció d'objectes un per un. S'utilitza per iterar a través de qualsevol estructura de dades basada en la col·lecció, incloses matrius, llistes, conjunts i mapes.

Un iterador té tres mètodes principals que s'utilitzen per recórrer la col·lecció:

  • hasNext() – Aquest mètode verifica si hi ha un altre element a la col·lecció que es pugui repetir.
  • next() – Aquest mètode retorna el següent element de la col·lecció.
  • remove() – Aquest mètode elimina l'element actual de la col·lecció.

La interfície Iterator forma part del Java Collection Framework, i és implementada per les classes que representen els diferents tipus de col·leccions.

Programa

Java
import java.util.ArrayList; import java.util.Iterator; public class IteratorExample { public static void main(String[] args) { ArrayListnoms = new ArrayList(); names.add('Alice'); names.add('Bob'); names.add('Charlie'); names.add('David'); // Creació d'un iterador per a la llista de noms Iteratoriterador = noms.iterador(); // Iterant sobre la llista de noms utilitzant l'iterador while (iterator.hasNext()) { String name = iterator.next(); System.out.println(nom); } } }>>

Sortida
Alice Bob Charlie David>

En aquest exemple, hem creat una ArrayList de cadenes i hi hem afegit quatre noms. Aleshores hem creat un iterador per a la llista utilitzant el mètode iterator() de la classe ArrayList. Hem utilitzat el mètode hasNext() per comprovar si hi ha més elements a la llista per repetir, i el mètode next() per obtenir el següent element de la llista. Hem imprès cada element mitjançant el mètode System.out.println().

L'ús d'un iterador per recórrer una col·lecció és una manera còmoda i eficaç d'iterar a través de la col·lecció perquè permet que la col·lecció es repeteixi sense conèixer l'estructura interna de la col·lecció. També permet l'eliminació d'elements de la col·lecció mentre s'itera sobre ella.

Avantatges d'Iterator a Java:

  • L'Iterator és una interfície senzilla i fàcil d'utilitzar que ens permet recórrer una col·lecció sense exposar la seva implementació subjacent.
  • L'iterador és una manera eficient d'iterar sobre una col·lecció, especialment quan tenim una gran quantitat de dades.
  • L'iterador proporciona una manera segura d'eliminar elements d'una col·lecció durant la iteració sense provocar cap excepció de modificació simultània.
  • La interfície Iterator està implementada per totes les classes de col·leccions a Java, de manera que podem utilitzar el mateix codi per iterar sobre diferents tipus de col·leccions.

Desavantatges d'Iterator a Java:

Hi ha certs desavantatges d'utilitzar Iterator a Java, com s'esmenta a continuació:

  • L'Iterador és una interfície unidireccional, el que significa que només podem avançar a través d'una col·lecció. No podem moure cap enrere o saltar a un element concret.
  • L'iterador no és segur per a fils, de manera que no podem utilitzar-lo per iterar sobre una col·lecció en un entorn multifil sense una sincronització adequada.
  • L'iterador no proporciona cap mecanisme per modificar elements mentre s'itera sobre una col·lecció, a part d'eliminar elements. Si necessitem modificar elements, haurem d'utilitzar altres interfícies com ListIterator o un simple bucle for.