logo

Iteratoriai Java

„Java“ žymeklis yra iteratorius, naudojamas kolekcijos arba srauto objekto elementams po vieną iteruoti, pervažiuoti arba nuskaityti. Šiame straipsnyje mes sužinosime apie „Java Iterators“ ir jų veikimą.

Java žymekliai

Kursorių tipai Java

Yra trys „Java“ žymekliai, kaip minėta toliau:



  1. Iteratorius
  2. Surašymas
  3. ListIterator

Pastaba: SplitIterator taip pat gali būti laikomas žymekliu, nes tai tik Iteratoriaus tipas.

1. Iteratorius

„Java“ kalbos iteratoriai naudojami Kolekcijos sistema norėdami gauti elementus po vieną. Tai yra Universalus iteratorius, nes galime jį pritaikyti bet kuriam Kolekcijos objektui. Naudodami Iteratorių galime atlikti ir skaitymo, ir pašalinimo operacijas. Tai patobulinta Enumeration versija su papildoma elemento pašalinimo funkcija.

Iteratorius turi būti naudojamas, kai norime išvardyti elementus visose kolekcijos sistemos įdiegtose sąsajose, pvz., Set, List, Queue, Deque ir visose įdiegtose žemėlapio sąsajos klasėse. Iteratorius yra tik žymeklis pasiekiamas visai rinkinio sistemai. Iteratoriaus objektas gali būti sukurtas skambinant iteratorius () Kolekcijos sąsajoje esantis metodas.



Sintaksė

Iterator itr = c.  iterator  ();>

Pastaba: Čia c yra bet koks Kolekcijos objektas. itr yra Iteratoriaus sąsajos tipo ir nurodo c.

dvejetainis paieškos algoritmas

Iteratoriaus sąsajos metodai Java

Iteratoriaus sąsaja apibrėžia trys toliau išvardyti metodai:

1. hasNext(): Grąžina tiesa, jei iteracija turi daugiau elementų.



public boolean hasNext();>

2. kitas(): Grąžina kitą iteracijos elementą. Tai meta NoSuchElementException jei daugiau elemento nėra.

public Object next();>

3. pašalinti (): Pašalina kitą iteracijos elementą. Šis metodas gali būti iškviestas tik vieną kartą per kvietimą į next().

public void remove();>

Pastaba: pašalinti () metodas gali padaryti dvi išimtis, būtent taip:

  • NepalaikomaOperationException : Jei pašalinimo operacijos nepalaiko šis iteratorius
  • IllegalStateException : Jei kitas metodas dar nebuvo iškviestas arba pašalinimo metodas jau buvo iškviestas po paskutinio kito metodo iškvietimo.

Kaip „Java Iterator“ veikia viduje?

Šiame skyriuje pabandysime suprasti, kaip Java Iterator ir jo metodai veikia viduje. Paimkime šį LinkedList objektą, kad suprastume šią funkciją.

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

Dabar sąrašo objekte sukurkime Iteratoriaus objektą, kaip parodyta toliau:

Iterator citiesIterator = cities.iterator();>

CityIteartor iteratorius atrodys taip –

„Java Iterator“ 1 veiksmas

Čia Iteratoriaus žymeklis yra nukreiptas prieš pirmąjį sąrašo elementą.

triguba žiema

Dabar paleisime šį kodo fragmentą.

citiesIterator.hasNext(); citiesIterator.next();>
„Java Iterator“ 2 veiksmas

Kai paleidžiame aukščiau pateiktą kodo fragmentą, Iteratoriaus žymeklis nurodo pirmąjį sąrašo elementą, kaip parodyta aukščiau esančioje diagramoje.

Dabar paleisime šį kodo fragmentą.

citiesIterator.hasNext(); citiesIterator.next();>
„Java Iterator“ 3 veiksmas

Kai paleidžiame aukščiau pateiktą kodo fragmentą, Iteratoriaus žymeklis nurodo antrąjį sąrašo elementą, kaip parodyta aukščiau esančioje diagramoje. Atlikite šį procesą, kad pasiektumėte Iteratoriaus žymeklį iki galo sąrašo elemento.

„Java Iterator“ veiksmas n

Perskaičius paskutinį elementą, jei paleisime toliau pateiktą kodo fragmentą, jis grąžins klaidingą reikšmę.

citiesIterator.hasNext();>
„Java Iterator“ pabaigoje

Iteratoriaus žymekliui nukreipiant į po paskutinio sąrašo elemento, metodas hasNext() grąžina klaidingą reikšmę.

Pastaba: Pastebėję visas šias diagramas, galime pasakyti, kad „Java Iterator“ palaiko tik pirmyn nukreiptą iteraciją, kaip parodyta toliau pateiktoje diagramoje. Taigi jis taip pat žinomas kaip vienakryptis žymeklis.

„Java Iterator“ veikimas

Pavyzdys

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 = naujas ArrayList (); // Iteravimas per sąrašą (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.iteratorius(); // Patikrinamas kitas elementas, kuriame // sąlyga galioja, kol sąraše yra vienas elementas // naudojant hasnext() metodą, while (itr.hasNext()) { // Žymeklio perkėlimas į kitą elementą int i = itr.next( ); // Elementų gavimas po vieną System.out.print(i + ' '); // Nelyginių elementų pašalinimas if (i % 2 != 0) itr.remove(); } // Kita eilutės komanda System.out.println(); // Elementų spausdinimas objekto viduje System.out.println(al); } }>>  
Išvestis
[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

Skirstytuvai, kaip ir kiti iteratoriai, yra skirti šaltinio elementams pereiti. Šaltinis gali būti a Kolekcija , IO kanalas arba generatoriaus funkcija. Jis įtrauktas į JDK 8, kad palaikytų efektyvų lygiagretųjį važiavimą (lygiagretųjį programavimą), be nuoseklaus judėjimo. „Java Spliterator“ sąsaja yra vidinis iteratorius, kuris suskaido srautą į mažesnes dalis. Šios mažesnės dalys gali būti apdorojamos lygiagrečiai.

Pastaba: Realiame programavime mums niekada nereikės tiesiogiai naudoti „Spliterator“. Įprastomis operacijomis jis elgsis lygiai taip pat kaip Java Iterator.

„Java Iterator“ pranašumai

  • Galime jį naudoti bet kuriai kolekcijos klasei.
  • Jis palaiko ir READ, ir REMOVE operacijas.
  • Tai universalus rinkinio žymeklio API.
  • Metodų pavadinimai yra paprasti ir juos lengva naudoti.

„Java Iterator“ apribojimai

Be to, yra tam tikrų „Iterator“ apribojimų, kurie išvardyti taip:

  • CRUD operacijose ji nepalaiko CREATE ir UPDATE operacijų.
  • Jis palaiko tik pirmyn krypties iteraciją, kuri yra vienkryptis iteratorius.
  • Palyginti su „Spliterator“, jis nepalaiko lygiagrečių iteracinių elementų, o tai reiškia, kad palaiko tik nuoseklią iteraciją.
  • Palyginti su Spliterator, jis nepalaiko geresnio našumo, kad būtų galima pakartoti didelius duomenų kiekius.

2. Surašymas

Tai sąsaja, naudojama gauti senų kolekcijų elementus (Vector, Hashtable). Sąrašas yra pirmasis iteratorius iš JDK 1.0, likusios dalys įtrauktos į JDK 1.2 su daugiau funkcijų. Sąrašai taip pat naudojami norint nurodyti įvesties srautus į a SequenceInputStream . Surašymo objektą galime sukurti paskambinę elementai () vektoriaus klasės metodas bet kuriame vektoriniame objekte

Sintaksė

Yra du Surašymo sąsajos metodai, būtent:

1. viešoji loginė vertė hasMoreElements(): Šis metodas patikrina, ar šiame sąraše yra daugiau elementų, ar ne.

2. Viešasis objektas nextElement(): Šis metodas grąžina kitą šio sąrašo elementą. Ji išmeta NoSuchElementException, jei nėra daugiau elementų

Pavyzdys

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

Išvestis
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 0 1 2 3 4 5 6 7 8 9>

Yra tam tikri skaičiavimo apribojimai, kurie yra tokie:

  • Sąrašas skirtas palikimas tik klasės (vektorius, maišos lentelė). Taigi tai nėra universalus iteratorius.
  • Pašalinimo operacijų negalima atlikti naudojant surašymą.
  • Galimas tik kartojimas į priekį.

„Java Enumeration“ ir „Iterator“ panašumai

  • Abu yra „Java“ žymekliai.
  • Abu yra naudojami objekto elementų kolekcijai kartoti po vieną.
  • Abi palaiko READ arba Retrieve operaciją.
  • Abu yra vienakrypčiai Java žymekliai, o tai reiškia, kad palaiko tik pirmyn nukreiptos iteracijos.

„Java Enumeration“ ir „Iterator“ skirtumai

Šioje lentelėje aprašomi „Java Enumeration“ ir „Iterator“ skirtumai:

SurašymasIteratorius
Pristatyta Java 1.0Pristatyta Java 1.2
Senoji sąsajaNe senoji sąsaja
Jis naudojamas tik Legacy Collection klasėms kartoti.Galime jį naudoti bet kuriai kolekcijos klasei.
Jis palaiko tik READ operaciją.Jis palaiko ir READ, ir DELETE operacijas.
Tai nėra universalus žymeklis.Tai universalus žymeklis.
Ilgi metodo pavadinimai.Paprasti ir lengvai naudojami metodų pavadinimai.

3. ListIterator

Jis taikomas tik sąrašo rinkinio įdiegtoms klasėms, tokioms kaip ArrayList, LinkedList ir kt. Ji suteikia dviejų krypčių iteraciją. ListIterator turi būti naudojamas, kai norime išvardyti sąrašo elementus. Šis žymeklis turi daugiau funkcijų (metodų) nei iteratorius. ListIterator objektą galima sukurti skambinant listIterator() metodą, esantį sąrašo sąsajoje.

Sintaksė

ListIterator ltr = l.  listIterator  ();>

Pastaba: Čia l yra bet koks sąrašo objektas, ltr yra tipo. ListIterator sąsaja ir nurodo l. ListIterator sąsaja išplečia Iterator sąsają. Taigi visi trys Iterator sąsajos metodai yra prieinami ListIterator. Be to, yra šeši daugiau metodų.

1. Kryptis pirmyn

1.1 hasNext (): Grąžina tiesa, jei iteracija turi daugiau elementų

public boolean hasNext();>

1.2 kitas(): Tas pats kaip next() Iteratoriaus metodas. Grąžina kitą iteracijos elementą.

public Object next();>

1.3 nextIndex(): Grąžina kitą elemento indeksą arba sąrašo dydį, jei sąrašo iteratorius yra sąrašo pabaigoje.

public int nextIndex();>

2. Kryptis atgal

2.1 turi Ankstesnis(): Grąžina true, jei iteracija turi daugiau elementų važiuojant atgal.

public boolean hasPrevious();>

2.2 Ankstesnis(): Grąžina ankstesnį elementą iteracijoje ir gali mesti NoSuchElementException jei nėra daugiau elementų.

public Object previous();>

2.3 AnkstesnisIndeksas(): Grąžina ankstesnio elemento indeksą arba -1, jei sąrašo iteratorius yra sąrašo pradžioje,

Pete'o Davidsono amžius
public int previousIndex();>

3. Kiti metodai

3.1 pašalinti (): Tas pats kaip Iteratoriaus pašalinimo () metodas. Pašalina kitą iteracijos elementą.

public void remove();>

3.2 rinkinys (Objekto objektas): Paskutinis elementas, grąžintas next() arba previous(), pakeičiamas nurodytu elementu.

public void set(Object obj);>

3.3 pridėti (Objekto objektas): Įterpia nurodytą elementą į sąrašą vietoje prieš elementą, kurį grąžintų next()

public void add(Object obj);>

Aišku, trys metodai, kurie ListIterator paveldi iš Iteratoriaus ( hasNext () , Kitas() , ir pašalinti () ) atlikite lygiai tą patį abiejose sąsajose. The turi Ankstesnis() o ankstesnės operacijos yra tikslūs analogai hasNext () ir Kitas() . Pirmosios operacijos nurodo elementą prieš (numanomą) žymeklį, o pastarosios nurodo elementą po žymeklio. Ankstesnė operacija perkelia žymeklį atgal, o kita – į priekį.

ListIterator neturi dabartinio elemento; jo žymeklio padėtis visada yra tarp elemento, į kurį būtų grąžintas iškvietimas ankstesnis () ir elementas, į kurį būtų grąžintas skambutis Kitas().

1 komplektas() metodas gali padaryti 4 išimtis.

  • UnsupportedOperationException: jei rinkinio operacijos nepalaiko šis sąrašo iteratorius
  • ClassCastException: Jei nurodyto elemento klasė neleidžia jo įtraukti į šį sąrašą
  • IllegalArgumentException: Jei kuris nors nurodyto elemento aspektas neleidžia jo įtraukti į šį sąrašą
  • IllegalStateException: Jei nei kitas, nei ankstesnis nebuvo iškviestas, arba pašalinti arba pridėti buvo iškviesti po paskutinio skambučio į kitą ar ankstesnį

2. pridėti () metodas gali padaryti 3 išimtis.

java palyginimas
  • UnsupportedOperationException: Jei šis sąrašo iteratorius nepalaiko pridėjimo metodo
  • ClassCastException: Jei nurodyto elemento klasė neleidžia jo įtraukti į šį sąrašą
  • IllegalArgumentException: Jei kuris nors šio elemento aspektas neleidžia jo įtraukti į šį sąrašą

Pavyzdys

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

Išvestis
[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]>

Pastaba: Panašiai yra tam tikrų ListIterator apribojimų . Tai yra galingiausias iteratorius, tačiau jis taikomas tik List įdiegtoms klasėms, todėl nėra universalus iteratorius.

Svarbūs punktai

  1. Atminkite, kad iš pradžių bet kokia iteratoriaus nuoroda nukreips į indeksą prieš pat pirmojo kolekcijos elemento indeksą.
  2. Mes nekuriame Enumeration, Iterator, ListIterator objektų, nes jie yra sąsajos. Objektams kurti naudojame tokius metodus kaip elements(), iterator(), listIterator(). Šie metodai turi anoniminį Vidinė klasė kuri išplečia atitinkamas sąsajas ir grąžina šios klasės objektą.

Pastaba: The $ simbolis nuorodos klasės pavadinime yra įrodymas, kad naudojama vidinių klasių sąvoka ir kuriami šios klasės objektai.

Tai galima patikrinti žemiau pateiktu kodu. Daugiau apie vidinę klasę žr

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

Išvestis
java.util.Vector java.util.Vector$Itr java.util.Vector$ListItr>

Paaiškinimas

„Java“ kalboje iteratorius yra sąsaja, naudojama objektų rinkiniui pereiti po vieną. Jis naudojamas kartoti per bet kokią rinkiniu pagrįstą duomenų struktūrą, įskaitant masyvus, sąrašus, rinkinius ir žemėlapius.

Iteratorius turi tris pagrindinius metodus, kurie naudojami rinkiniui pereiti:

  • hasNext() – šis metodas patikrina, ar kolekcijoje yra dar vienas elementas, kurį galima kartoti.
  • next() – šis metodas grąžina kitą kolekcijos elementą.
  • pašalinti () – šis metodas pašalina dabartinį elementą iš kolekcijos.

Iteratoriaus sąsaja yra „Java Collection Framework“ dalis ir ją įgyvendina klasės, atstovaujančios skirtingus kolekcijų tipus.

Programa

Java
import java.util.ArrayList; import java.util.Iterator; public class IteratorExample { public static void main(String[] args) { ArrayListvardai = naujas ArrayList(); vardai.add('Alisa'); vardai.add('Bob'); vardai.add('Čarlis'); vardai.add('Deividas'); // Iteratoriaus kūrimas vardų sąrašui Iteratoriusiteratorius = vardai.iteratorius(); // Vardų sąrašo kartojimas naudojant iteratorių while (iterator.hasNext()) { String name = iterator.next(); System.out.println(vardas); } } }>

Išvestis
Alice Bob Charlie David>

Šiame pavyzdyje sukūrėme eilučių ArrayList ir pridėjome prie jo keturis pavadinimus. Tada sukūrėme sąrašo iteratorių naudodami ArrayList klasės metodą iterator(). Naudojome metodą hasNext() norėdami patikrinti, ar sąraše yra daugiau elementų, kuriuos reikia kartoti, ir next() metodą, kad gautume kitą elementą sąraše. Kiekvieną elementą atspausdinome naudodami System.out.println() metodą.

Iteratoriaus naudojimas rinkiniui pereiti yra patogus ir efektyvus būdas kartoti kolekciją, nes tai leidžia kartoti rinkinį nežinant vidinės kolekcijos struktūros. Tai taip pat leidžia pašalinti elementus iš kolekcijos kartojant ją.

„Iterator“ pranašumai „Java“:

  • Iteratorius yra paprasta ir lengvai naudojama sąsaja, leidžianti naršyti po kolekciją neatskleidžiant jos pagrindinio įgyvendinimo.
  • Iteratorius yra efektyvus būdas kartoti kolekciją, ypač kai turime daug duomenų.
  • Iteratorius suteikia saugų būdą pašalinti elementus iš kolekcijos iteracijos metu nesudarant jokių tuo pačiu metu vykstančių modifikacijų išimčių.
  • „Iterator“ sąsaja yra įdiegta visose „Java“ kolekcijų klasėse, todėl galime naudoti tą patį kodą, norėdami kartoti skirtingų tipų kolekcijas.

„Iterator“ trūkumai „Java“:

Yra tam tikrų „Iterator“ naudojimo „Java“ trūkumų, kaip nurodyta toliau:

  • Iteratorius yra vienakryptė sąsaja, o tai reiškia, kad galime judėti į priekį tik per kolekciją. Negalime judėti atgal arba pereiti prie konkretaus elemento.
  • Iteratorius nėra saugus gijų, todėl negalime jo naudoti kartoti per kolekciją kelių gijų aplinkoje be tinkamo sinchronizavimo.
  • Iteratorius nenumato jokio elementų modifikavimo mechanizmo kartojant kolekciją, išskyrus elementų pašalinimą. Jei mums reikia modifikuoti elementus, turime naudoti kitas sąsajas, pvz., ListIterator arba paprastą forumą.