logo

Iteraattorit Javassa

Java-kohdistin on iteraattori, jota käytetään kokoelma- tai stream-objektin elementtien iterointiin tai läpikulkuun tai hakemiseen yksitellen. Tässä artikkelissa opimme Java-iteraattoreista ja sen toimivuudesta.

Java-osoittimet

Kursorityypit Javassa

On kolme kohdistinta Javassa alla mainitulla tavalla:

  1. Iteraattori
  2. Luettelo
  3. ListIterator

Huomautus: SplitIteratoria voidaan pitää myös kursorina, koska se on vain Iterator-tyyppi.



1. Iteraattori

Java-iteraattoreita käytetään Keräyskehys noutaa elementtejä yksitellen. Se on a yleismaailmallinen iteraattori, koska voimme soveltaa sitä mihin tahansa kokoelmaobjektiin. Iteratorin avulla voimme suorittaa sekä luku- että poistotoimintoja. Se on Enumerationin parannettu versio, jonka lisätoimintona on elementin poistaminen.

Iteraattoria on käytettävä aina, kun haluamme luetella elementtejä kaikissa Collection-kehyksen toteuttamissa liitännöissä, kuten Set, List, Queue, Deque ja kaikissa toteutetuissa Map-rajapinnan luokissa. Iteraattori on vain kohdistin saatavilla koko kokoelmakehykselle. Iteraattoriobjekti voidaan luoda kutsumalla iteraattori() kokoelman käyttöliittymässä oleva menetelmä.

Syntaksi

Iterator itr = c.  iterator  ();>

Huomautus: Tässä c on mikä tahansa kokoelmaobjekti. itr on tyyppiä Iterator-liitäntä ja viittaa c.

python-konstruktori

Iteraattorirajapinnan menetelmät Javassa

Iteraattorin käyttöliittymä määrittelee kolme alla luetellut menetelmät:

1. hasNext(): Palauttaa tosi, jos iteraatiossa on enemmän elementtejä.

public boolean hasNext();>

2. seuraava(): Palauttaa iteroinnin seuraavan elementin. Se heittää NoSuchElementException jos elementtejä ei ole enempää.

public Object next();>

3. poista(): Poistaa iteroinnin seuraavan elementin. Tätä menetelmää voidaan kutsua vain kerran per kutsu next().

public void remove();>

Huomautus: Poista() menetelmä voi heittää kaksi poikkeusta, nimittäin seuraavasti:

  • Ei tuettuOperationException : Jos tämä iteraattori ei tue poistotoimintoa
  • IllegalStateException : Jos seuraavaa menetelmää ei ole vielä kutsuttu tai poistomenetelmää on jo kutsuttu seuraavan menetelmän viimeisen kutsun jälkeen.

Kuinka Java Iterator toimii sisäisesti?

Tässä osiossa yritämme ymmärtää, kuinka Java Iterator ja sen menetelmät toimivat sisäisesti. Otetaan seuraava LinkedList-objekti ymmärtääksemme tämän toiminnon.

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

Luokaamme nyt Iterator-objekti List-objektiin alla olevan kuvan mukaisesti:

Iterator citiesIterator = cities.iterator();>

CityIteartor-iteraattori näyttää tältä -

Java Iterator Vaihe 1

Tässä Iteratorin kohdistin osoittaa ennen luettelon ensimmäistä elementtiä.

Nyt suoritamme seuraavan koodinpätkän.

muodosta yhteys Java-tietokantaan
citiesIterator.hasNext(); citiesIterator.next();>
Java Iterator Vaihe 2

Kun suoritamme yllä olevan koodinpätkän, Iteratorin kohdistin osoittaa luettelon ensimmäiseen elementtiin yllä olevan kaavion mukaisesti.

Nyt suoritamme seuraavan koodinpätkän.

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

Kun suoritamme yllä olevan koodinpätkän, Iteratorin kohdistin osoittaa luettelon toiseen elementtiin yllä olevan kaavion mukaisesti. Tee tämä prosessi päästäksesi iteraattorin kohdistin luettelon loppuelementtiin.

Java Iterator Vaihe n

Jos suoritamme alla olevan koodinpätkän viimeisen elementin lukemisen jälkeen, se palauttaa väärän arvon.

citiesIterator.hasNext();>
Java Iterator lopussa

Kun Iteratorin kohdistin osoittaa listan viimeisen elementin jälkeen, hasNext()-metodi palauttaa väärän arvon.

Huomautus: Tarkasteltuamme kaikkia näitä kaavioita voimme sanoa, että Java Iterator tukee vain eteenpäin suunnattua iteraatiota, kuten alla olevassa kaaviossa näkyy. Joten se tunnetaan myös nimellä Uni-Directional Cursor.

Java Iterator toimii

Esimerkki

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 = uusi ArrayList (); // Iterointi listan yli kohteelle (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(); // Tarkistetaan seuraava elementti, jossa // ehto pätee, kunnes listassa on yksi elementti // käyttämällä hasnext()-metodia while (itr.hasNext()) { // Kohdistimen siirtäminen seuraavaan elementtiin int i = itr.next( ); // Elementtien hakeminen yksitellen System.out.print(i + ' '); // Parittomien elementtien poistaminen if (i % 2 != 0) itr.remove(); } // Seuraavan rivin komento System.out.println(); // Objektin sisällä olevien elementtien tulostaminen System.out.println(al); } }>

Lähtö
[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

Splitterit, kuten muutkin iteraattorit, ovat lähteen elementtien läpikulkua varten. Lähde voi olla a Kokoelma , IO-kanava tai generaattoritoiminto. Se sisältyy JDK 8:aan tehokkaan rinnakkaiskierroksen (rinnakkaisohjelmoinnin) tukemiseksi peräkkäisen läpikulun lisäksi. Java Spliterator -käyttöliittymä on sisäinen iteraattori, joka jakaa virran pienempiin osiin. Näitä pienempiä osia voidaan käsitellä rinnakkain.

Huomautus: Tosielämän ohjelmoinnissa meidän ei ehkä koskaan tarvitse käyttää Spliteratoria suoraan. Normaalissa käytössä se käyttäytyy täsmälleen samalla tavalla kuin Java Iterator.

Java Iteratorin edut

  • Voimme käyttää sitä mihin tahansa Collection-luokkaan.
  • Se tukee sekä READ- että REMOVE-toimintoja.
  • Se on Universal Cursor for Collection API.
  • Menetelmien nimet ovat yksinkertaisia ​​ja helppokäyttöisiä.

Java Iteratorin rajoitukset

Lisäksi Iteratorilla on tiettyjä rajoituksia, jotka on lueteltu seuraavasti:

  • CRUD-toiminnoissa se EI tue CREATE- ja UPDATE-toimintoja.
  • Se tukee vain eteenpäin suunnattua iteraatiota, joka on yksisuuntainen iteraattori.
  • Spliteratoriin verrattuna se EI tue iteroituja elementtejä rinnakkain, mikä tarkoittaa, että se tukee vain peräkkäistä iteraatiota.
  • Spliteratoriin verrattuna se EI tue parempaa suorituskykyä suurten tietomäärien toistamiseen.

2. Luettelo

Se on käyttöliittymä, jota käytetään vanhojen kokoelmien elementtien hankkimiseen (Vector, Hashtable). Luettelo on ensimmäinen iteraattori JDK 1.0:sta, loput sisältyvät JDK 1.2:een, jossa on enemmän toimintoja. Luetteloita käytetään myös määrittämään syöttövirrat a:lle SequenceInputStream . Voimme luoda Enumeration-objektin soittamalla elementit() vektoriluokan menetelmä missä tahansa vektoriobjektissa

Syntaksi

// Here 'v' is an Vector class object. e is of // type Enumeration interface and refers to 'v' Enumeration e =   v  .  elements  ();>

On kaksi menetelmät luettelointirajapinnassa, nimittäin:

1. julkinen boolean hasMoreElements(): Tämä menetelmä testaa, sisältääkö tämä luettelo enemmän elementtejä vai ei.

2. julkinen objekti nextElement(): Tämä menetelmä palauttaa tämän luettelon seuraavan elementin. Se heittää NoSuchElementExceptionin, jos elementtejä ei ole enempää

Esimerkki

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 + ' '); } } }>

Lähtö
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 0 1 2 3 4 5 6 7 8 9>

Luetteloinnissa on tiettyjä rajoituksia, jotka ovat seuraavat:

  • Luettelo on tarkoitettu perintöä vain luokat (vektori, hashtable). Siksi se ei ole universaali iteraattori.
  • Poistotoimintoja ei voi suorittaa luettelointia käyttämällä.
  • Vain eteenpäin suuntautuva iterointi on mahdollista.

Java Enumerationin ja Iteratorin yhtäläisyydet

  • Molemmat ovat Java-kursoreita.
  • Molempia käytetään objektielementtien kokoelman iterointiin yksitellen.
  • Molemmat tukevat READ- tai Retrieval-toimintoa.
  • Molemmat ovat yksisuuntaisia ​​Java-kursoreita, mikä tarkoittaa, että ne tukevat vain eteenpäin suunnattua iteraatiota.

Erot Java Enumerationin ja Iteratorin välillä

Seuraavassa taulukossa kuvataan erot Java Enumerationin ja Iteratorin välillä:

LuetteloIteraattori
Esitelty Java 1.0:ssaEsitelty Java 1.2:ssa
Vanha käyttöliittymäEi vanha käyttöliittymä
Sitä käytetään vain Legacy Collection -luokkien iterointiin.Voimme käyttää sitä mihin tahansa Collection-luokkaan.
Se tukee vain READ-toimintoa.Se tukee sekä READ- että DELETE-toimintoja.
Se ei ole universaali kursori.Se on universaali kohdistin.
Pitkät menetelmän nimet.Yksinkertaiset ja helppokäyttöiset menetelmänimet.

3. ListIterator

Se soveltuu vain List-kokoelmaan toteutetuille luokille, kuten ArrayList, LinkedList jne. Se tarjoaa kaksisuuntaisen iteroinnin. ListIteratoria on käytettävä, kun haluamme luetella Listan elementtejä. Tällä kursorilla on enemmän toimintoja (menetelmiä) kuin iteraattorilla. ListIterator-objekti voidaan luoda kutsumalla listIterator() List-käyttöliittymässä oleva menetelmä.

Syntaksi

ListIterator ltr = l.  listIterator  ();>

Huomautus: Tässä l on mikä tahansa List-objekti, ltr on tyyppiä. ListIterator käyttöliittymä ja viittaa l. ListIterator-käyttöliittymä laajentaa Iterator-käyttöliittymää. Joten kaikki kolme Iterator-rajapinnan menetelmää ovat käytettävissä ListIteratorille. Lisäksi on olemassa kuusi lisää menetelmiä.

1. Suunta eteenpäin

1.1 hasNext(): Palauttaa tosi, jos iteraatiossa on enemmän elementtejä

public boolean hasNext();>

1.2 seuraava(): Sama kuin next()-metodi Iteratorissa. Palauttaa iteroinnin seuraavan elementin.

public Object next();>

1.3 nextIndex(): Palauttaa seuraavan elementtiindeksin tai luettelon koon, jos luetteloiteraattori on luettelon lopussa.

public int nextIndex();>

2. Taaksepäin suunta

2.1 hasPrevious(): Palauttaa tosi, jos iteraatiossa on enemmän elementtejä, kun se kulkee taaksepäin.

public boolean hasPrevious();>

2.2 edellinen(): Palauttaa iteroinnin edellisen elementin ja voi heittää NoSuchElementException jos elementtejä ei enää ole.

public Object previous();>

2.3 previousIndex(): Palauttaa edellisen elementtiindeksin tai -1:n, jos listaiteraattori on listan alussa,

java häntä
public int previousIndex();>

3. Muut menetelmät

3.1 poista(): Sama kuin Iteratorin remove()-menetelmä. Poistaa iteroinnin seuraavan elementin.

public void remove();>

3.2 set(Object Obj): Korvaa viimeisen()- tai previous()-parametrin palauttaman elementin määritetyllä elementillä.

public void set(Object obj);>

3.3 add(Object Obj): Lisää määritetyn elementin luetteloon kohtaan ennen elementtiä, jonka next() palauttaisi

public void add(Object obj);>

On selvää, että kolme menetelmää ListIterator perii Iteratorista ( hasNext() , Seuraava() , ja Poista() ) tehdä täsmälleen saman asian molemmissa käyttöliittymissä. The hasPrevious() ja edelliset operaatiot ovat täsmällisiä analogeja hasNext() ja Seuraava() . Edellinen operaatio viittaa elementtiin ennen (implisiittistä) kohdistinta, kun taas jälkimmäinen viittaa elementtiin kohdistimen jälkeen. Edellinen toiminto siirtää kohdistinta taaksepäin, kun taas seuraava siirtää sitä eteenpäin.

ListIteratorissa ei ole nykyistä elementtiä; sen kursorin sijainti on aina sen elementin välissä, jolle kutsu palautettaisiin Edellinen() ja elementti, johon kutsu palautettaisiin Seuraava().

1 sarja() menetelmä voi antaa 4 poikkeusta.

  • Ei tuettuOperationException: jos tämä luetteloiteraattori ei tue asetustoimintoa
  • ClassCastException: Jos määritetyn elementin luokka estää sen lisäämisen tähän luetteloon
  • IllegalArgumentException: Jos jokin määritetyn elementin osa estää sen lisäämisen tähän luetteloon
  • IllegalStateException: Jos seuraavaa tai edellistä ei ole kutsuttu, tai poista tai lisää on kutsuttu viimeisen puhelun jälkeen seuraavaan tai edelliseen

2. add() menetelmä voi tehdä 3 poikkeusta.

  • Ei tuettuOperationException: Jos tämä luetteloiteraattori ei tue lisäysmenetelmää
  • ClassCastException: Jos määritetyn elementin luokka estää sen lisäämisen tähän luetteloon
  • IllegalArgumentException: Jos jokin tämän elementin osa estää sen lisäämisen tähän luetteloon

Esimerkki

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); } }>

Lähtö
[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]>

Huomautus: Vastaavasti ListIteratorilla on tiettyjä rajoituksia . Se on tehokkain iteraattori, mutta se soveltuu vain List-toteutettuihin luokkiin, joten se ei ole yleinen iteraattori.

c ohjelma merkkijonojen vertailuun

Tärkeitä kohtia

  1. Huomaa, että aluksi kaikki iteraattoriviittaukset osoittavat indeksiin juuri ennen kokoelman ensimmäisen elementin indeksiä.
  2. Emme luo Enumeration-, Iterator- tai ListIterator-objekteja, koska ne ovat rajapintoja. Käytämme menetelmiä, kuten elements(), iterator(), listIterator() objektien luomiseen. Näillä menetelmillä on anonyymi Sisäinen luokka joka laajentaa vastaavia rajapintoja ja palauttaa tämän luokkaobjektin.

Huomautus: The $ symboli viiteluokan nimessä on todiste siitä, että sisäisten luokkien käsitettä käytetään ja nämä luokkaobjektit luodaan.

Tämä voidaan varmistaa alla olevalla koodilla. Katso lisää sisäluokasta

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()); } }>

Lähtö
java.util.Vector java.util.Vector$Itr java.util.Vector$ListItr>

Selitys

Javassa iteraattori on käyttöliittymä, jota käytetään kulkemaan objektikokoelman läpi yksitellen. Sitä käytetään iteroitaessa minkä tahansa kokoelmapohjaisen tietorakenteen, mukaan lukien taulukot, luettelot, joukot ja kartat, läpi.

Iteraattorilla on kolme päämenetelmää, joita käytetään kokoelman läpi kulkemiseen:

  • hasNext() – Tämä menetelmä tarkistaa, onko kokoelmassa jotain muuta elementtiä, joka voidaan iteroida.
  • next() – Tämä menetelmä palauttaa kokoelman seuraavan elementin.
  • remove() – Tämä menetelmä poistaa nykyisen elementin kokoelmasta.

Iterator-rajapinta on osa Java Collection Frameworkia, ja sen toteuttavat eri tyyppisiä kokoelmia edustavat luokat.

Ohjelmoida

Java
import java.util.ArrayList; import java.util.Iterator; public class IteratorExample { public static void main(String[] args) { ArrayListnimet = uusi ArrayList(); names.add('Liisa'); names.add('Bob'); names.add('Charlie'); names.add('David'); // Iteraattorin luominen nimiluettelolle Iteratoriteraattori = nimet.iteraattori(); // Iterointi nimiluettelon yli käyttäen iteraattoria while (iterator.hasNext()) { Merkkijonon nimi = iterator.next(); System.out.println(nimi); } } }>

Lähtö
Alice Bob Charlie David>

Tässä esimerkissä olemme luoneet ArrayListin merkkijonoista ja lisänneet siihen neljä nimeä. Tämän jälkeen olemme luoneet luettelolle iteraattorin ArrayList-luokan iterator()-metodilla. Olemme käyttäneet hasNext()-metodia tarkistaaksemme, onko luettelossa useampia iteroitavia elementtejä, ja next()-menetelmää saadaksemme listan seuraavan elementin. Olemme tulostaneet jokaisen elementin System.out.println()-menetelmällä.

Iteraattorin käyttäminen kokoelman läpi kulkemiseen on kätevä ja tehokas tapa iteroida kokoelman läpi, koska se mahdollistaa kokoelman iteroinnin ilman kokoelman sisäistä rakennetta. Se mahdollistaa myös elementtien poistamisen kokoelmasta toistettaessa sitä.

Iteratorin edut Javassa:

  • Iterator on yksinkertainen ja helppokäyttöinen käyttöliittymä, jonka avulla voimme kulkea kokoelman läpi paljastamatta sen taustalla olevaa toteutusta.
  • Iteraattori on tehokas tapa iteroida kokoelmaa, varsinkin kun meillä on suuri määrä dataa.
  • Iteraattori tarjoaa turvallisen tavan poistaa elementtejä kokoelmasta iteroinnin aikana aiheuttamatta samanaikaisia ​​muokkauspoikkeuksia.
  • Iterator-rajapinta on toteutettu kaikissa Javan kokoelmaluokissa, joten voimme käyttää samaa koodia iteroidaksemme erityyppisiä kokoelmia.

Javan Iteratorin haitat:

Iteratorin käyttämisessä Javassa on tiettyjä haittoja, kuten alla on mainittu:

  • Iteraattori on yksisuuntainen käyttöliittymä, mikä tarkoittaa, että voimme siirtyä eteenpäin vain kokoelman kautta. Emme voi siirtyä taaksepäin tai hypätä tiettyyn elementtiin.
  • Iteraattori ei ole säikeen varma, joten emme voi käyttää sitä iteroimaan kokoelmaa monisäikeisessä ympäristössä ilman asianmukaista synkronointia.
  • Iteraattori ei tarjoa mitään mekanismia elementtien muokkaamiseen kokoelman iteroinnin aikana, paitsi elementtien poistamisen. Jos meidän on muokattava elementtejä, meidän on käytettävä muita käyttöliittymiä, kuten ListIterator tai yksinkertainen for-silmukka.