Kurzor Java je iterátor, ktorý sa používa na iteráciu, prechádzanie alebo získavanie prvkov kolekcie alebo toku po jednom. V tomto článku sa dozvieme o Java iterátoroch a ako to funguje.
Typy kurzorov v Jave
Existujú tri kurzory v jazyku Java, ako je uvedené nižšie:
- Iterátor
- Enumerácia
- ListIterator
Poznámka: SplitIterator možno považovať aj za kurzor, keďže ide len o typ Iterátora.
1. Iterátor
Iterátory v jazyku Java sa používajú v Kolekčný rámec na načítanie prvkov jeden po druhom. Je to a univerzálny iterátor, pretože ho môžeme použiť na akýkoľvek objekt Collection. Pomocou Iterátora môžeme vykonávať operácie čítania aj odstraňovania. Ide o vylepšenú verziu Enumeration s ďalšou funkcionalitou odstránenia prvku.
Iterátor sa musí použiť vždy, keď chceme vymenovať prvky vo všetkých rozhraniach implementovaných v rámci kolekcie, ako sú Set, List, Queue, Deque a všetky implementované triedy rozhrania Map. Iterátor je iba kurzor dostupný pre celý rámec kolekcie. Objekt iterátora možno vytvoriť volaním iterátor() metóda prítomná v rozhraní kolekcie.
Syntax
Iterator itr = c. iterator ();>
Poznámka: Tu c je akýkoľvek objekt kolekcie. itr je typu Iterator interface a odkazuje na c.
pár c++
Metódy iterátorového rozhrania v Jave
Rozhranie iterátora definuje tri metódy uvedené nižšie:
1. hasNext(): Vráti hodnotu true, ak má iterácia viac prvkov.
public boolean hasNext();>
2. ďalšie(): Vráti ďalší prvok v iterácii. To hádže NoSuchElementException ak už nie je prítomný žiadny prvok.
public Object next();>
3. odstrániť(): Odstráni ďalší prvok v iterácii. Túto metódu možno zavolať iba raz za volanie funkcie next().
public void remove();>
Poznámka: odstrániť () metóda môže spôsobiť dve výnimky, a to takto:
- UnsupportedOperationException : Ak tento iterátor nepodporuje operáciu odstránenia
- IllegalStateException : Ak ďalšia metóda ešte nebola zavolaná alebo metóda remove už bola zavolaná po poslednom volaní ďalšej metódy.
Ako interne funguje Java Iterator?
V tejto časti sa pokúsime pochopiť, ako interne funguje Java Iterator a jeho metódy. Zoberme si nasledujúci objekt LinkedList, aby sme pochopili túto funkciu.
List cities = new LinkedList(); cities.add('G-1'); cities.add('G-2'); cities.add('G-3'); . . . cities.add('G-n');>Teraz vytvorte objekt Iterator na objekte List, ako je uvedené nižšie:
Iterator citiesIterator = cities.iterator();>
Iterátor citiesIteartor bude vyzerať takto –
Kurzor iterátora tu ukazuje pred prvým prvkom zoznamu.
Teraz spustíme nasledujúci útržok kódu.
.ďalšia java
citiesIterator.hasNext(); citiesIterator.next();>
Keď spustíme vyššie uvedený útržok kódu, kurzor iterátora ukazuje na prvý prvok v zozname, ako je znázornené na obrázku vyššie.
Teraz spustíme nasledujúci útržok kódu.
citiesIterator.hasNext(); citiesIterator.next();>
Keď spustíme vyššie uvedený útržok kódu, kurzor iterátora ukazuje na druhý prvok v zozname, ako je znázornené na obrázku vyššie. Vykonajte tento proces, aby ste dosiahli kurzor iterátora na koncový prvok zoznamu.
Ak po prečítaní posledného prvku spustíme nižšie uvedený útržok kódu, vráti falošnú hodnotu.
citiesIterator.hasNext();>

Keďže kurzor iterátora ukazuje na posledný prvok zoznamu, metóda hasNext() vracia falošnú hodnotu.
Poznámka: Po spozorovaní všetkých týchto diagramov môžeme povedať, že Java Iterator podporuje iba smerovanie vpred, ako je znázornené na obrázku nižšie. Preto je tiež známy ako jednosmerný kurzor.

Príklad
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 = nový ArrayList (); // Iterácia cez zoznam pre (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(); // Kontrola ďalšieho prvku, kde // podmienka platí, kým sa v zozname nenachádza jediný prvok // pomocou metódy hasnext() while (itr.hasNext()) { // Presun kurzora na ďalší prvok int i = itr.next( ); // Získanie prvkov po jednom System.out.print(i + ' '); // Odstránenie nepárnych prvkov if (i % 2 != 0) itr.remove(); } // Príkaz pre ďalší riadok System.out.println(); // Tlač prvkov vo vnútri objektu System.out.println(al); } }> Výkon
[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
Rozdeľovače, podobne ako iné iterátory, slúžia na prechádzanie prvkami zdroja. Zdrojom môže byť a Zbierka , IO kanál alebo funkcia generátora. Je súčasťou JDK 8 na podporu efektívneho paralelného prechodu (paralelné programovanie) okrem sekvenčného prechodu. Rozhranie Java Spliterator je interný iterátor, ktorý rozdeľuje prúd na menšie časti. Tieto menšie časti je možné spracovávať paralelne.
Poznámka: Pri programovaní v reálnom živote možno nikdy nebudeme musieť použiť priamo Spliterator. Pri bežných operáciách sa bude správať úplne rovnako ako Java Iterator.
Výhody Java Iterator
- Môžeme ho použiť pre akúkoľvek triedu Collection.
- Podporuje operácie READ aj REMOVE.
- Je to Universal Cursor for Collection API.
- Názvy metód sú jednoduché a ľahko sa používajú.
Obmedzenia Java Iterator
Okrem toho existujú určité obmedzenia Iterátora, ktoré sú uvedené nasledovne:
- V CRUD Operations nepodporuje operácie CREATE a UPDATE.
- Podporuje iba iteráciu smeru dopredu, čo je jednosmerný iterátor.
- V porovnaní s Spliteratorom nepodporuje paralelné iterovanie prvkov, čo znamená, že podporuje iba sekvenčnú iteráciu.
- V porovnaní s Spliteratorom nepodporuje lepší výkon na iteráciu veľkých objemov údajov.
2. Enumerácia
Je to rozhranie používané na získanie prvkov starších kolekcií (Vector, Hashtable). Enumerácia je prvý iterátor prítomný od JDK 1.0, resty sú zahrnuté v JDK 1.2 s väčšou funkčnosťou. Enumerácie sa tiež používajú na špecifikáciu vstupných tokov do a SequenceInputStream . Zavolaním môžeme vytvoriť objekt Enumeration prvky() metóda triedy vector na ľubovoľnom vektorovom objekte
Syntax
// Here 'v' is an Vector class object. e is of // type Enumeration interface and refers to 'v' Enumeration e = v . elements ();>
Existujú dva metódy v rozhraní Enumeration, konkrétne:
1. public boolean hasMoreElements(): Táto metóda testuje, či tento zoznam obsahuje viac prvkov alebo nie.
2. verejný objekt nextElement(): Táto metóda vráti ďalší prvok tohto enumerácie. Vyhodí NoSuchElementException, ak už nie je prítomný žiadny prvok
Príklad
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 + ' '); } } }> Výkon
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 0 1 2 3 4 5 6 7 8 9>
Existujú určité obmedzenia výčtu, ktoré sú nasledovné:
- Enumerácia je pre dedičstvo len triedy (vektor, hashtable). Nejde teda o univerzálny iterátor.
- Operácie odstránenia nie je možné vykonať pomocou Enumeration.
- Možné je len iterovanie smerom dopredu.
Podobnosti medzi Java Enumeration a Iterator
- Oba sú kurzory Java.
- Obidva sa používajú na iteráciu kolekcie prvkov objektu jeden po druhom.
- Obe podporujú operáciu READ alebo Retrieval.
- Obidva sú jednosmerné kurzory Java, čo znamená, že podporujú iba iteráciu smeru vpred.
Rozdiely medzi Java Enumeration a Iterator
Nasledujúca tabuľka popisuje rozdiely medzi Java Enumeration a Iterator:
| Enumerácia | Iterátor |
|---|---|
| Zavedené v jazyku Java 1.0 | Zavedené v jazyku Java 1.2 |
| Staršie rozhranie | Nie staršie rozhranie |
| Používa sa na iteráciu iba tried Legacy Collection. | Môžeme ho použiť pre akúkoľvek triedu Collection. |
| Podporuje iba operáciu READ. | Podporuje operácie READ aj DELETE. |
| Nie je to univerzálny kurzor. | Je to univerzálny kurzor. |
| Zdĺhavé názvy metód. | Jednoduché a ľahko použiteľné názvy metód. |
3. ListIterator
Je použiteľný iba pre triedy implementované do kolekcie List, ako je ArrayList, LinkedList atď. Poskytuje obojsmernú iteráciu. ListIterator sa musí použiť, keď chceme vymenovať prvky zoznamu. Tento kurzor má viac funkcií (metód) ako iterátor. Objekt ListIterator je možné vytvoriť volaním listIterator() metóda prítomná v rozhraní zoznamu.
Syntax
ListIterator ltr = l. listIterator ();>
Poznámka: Tu je l ľubovoľný objekt zoznamu, ltr je typu. Rozhranie ListIterator a odkazuje na l. Rozhranie ListIterator rozširuje rozhranie Iterator. Takže všetky tri metódy rozhrania Iterator sú dostupné pre ListIterator. Okrem toho existujú šesť viac metód.
1. Smer dopredu
1.1 hasNext(): Vráti hodnotu true, ak má iterácia viac prvkov
public boolean hasNext();>1.2 ďalej(): Rovnaké ako metóda next() Iterátora. Vráti ďalší prvok v iterácii.
public Object next();>1.3 nextIndex(): Vráti index ďalšieho prvku alebo veľkosť zoznamu, ak je iterátor zoznamu na konci zoznamu.
public int nextIndex();>
2. Smer dozadu
2.1 hasPrevious(): Vráti hodnotu true, ak má iterácia viac prvkov pri spätnom prechode.
public boolean hasPrevious();>2.2 predchádzajúci(): Vráti predchádzajúci prvok v iterácii a môže hodiť NoSuchElementException ak už nie je prítomný žiadny prvok.
public Object previous();>2.3 PreviousIndex(): Vráti predchádzajúci index prvku alebo -1, ak je iterátor zoznamu na začiatku zoznamu,
abeceda s číslamipublic int previousIndex();>
3. Iné metódy
3.1 odstrániť(): Rovnaké ako metóda remove() Iterátora. Odstráni ďalší prvok v iterácii.
public void remove();>3.2 sada (objekt objektu): Nahradí posledný prvok vrátený funkciou next() alebo previous() zadaným prvkom.
public void set(Object obj);>3.3 pridať (objekt objektu): Vloží zadaný prvok do zoznamu na pozíciu pred prvkom, ktorý by vrátila funkcia next()
public void add(Object obj);>
Je zrejmé, že tri metódy, ktoré ListIterator dedí od Iterátora ( hasNext() , Ďalšie() , a odstrániť () ) robiť presne to isté v oboch rozhraniach. The hasPrevious() a predchádzajúce operácie sú presnými analógmi hasNext() a Ďalšie() . Prvé operácie sa vzťahujú na prvok pred (implicitným) kurzorom, zatiaľ čo druhé sa vzťahujú na prvok za kurzorom. Predchádzajúca operácia presunie kurzor dozadu, zatiaľ čo nasledujúca ho posunie dopredu.
ListIterator nemá žiadny aktuálny prvok; jeho pozícia kurzora vždy leží medzi prvkom, ktorý by bol vrátený volaním predchádzajúci() a prvok, ktorý by bol vrátený volaním na Ďalšie().
1 sada() metóda môže vyvolať 4 výnimky.
- UnsupportedOperationException: ak operácia nastavenia nie je podporovaná týmto iterátorom zoznamu
- ClassCastException: Ak trieda zadaného prvku bráni jeho pridaniu do tohto zoznamu
- IllegalArgumentException: Ak niektorý aspekt zadaného prvku bráni jeho pridaniu do tohto zoznamu
- IllegalStateException: Ak po poslednom hovore nebolo volané ani ďalšie, ani predchádzajúce, alebo ak ste po poslednom hovore nezavolali na nasledujúci alebo predchádzajúci hovor
2. pridať() metóda môže vyvolať 3 výnimky.
- UnsupportedOperationException: Ak tento iterátor zoznamu nepodporuje metódu pridávania
- ClassCastException: Ak trieda zadaného prvku bráni jeho pridaniu do tohto zoznamu
- IllegalArgumentException: Ak niektorý aspekt tohto prvku bráni jeho pridaniu do tohto zoznamu
Príklad
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); } }> Výkon
[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]>
Poznámka: Podobne existujú určité obmedzenia pri ListIterator . Je to najvýkonnejší iterátor, ale je použiteľný iba pre triedy implementované do zoznamu, takže nejde o univerzálny iterátor.
c programy
Dôležité body
- Upozorňujeme, že na začiatku bude akýkoľvek odkaz iterátora ukazovať na index tesne pred indexom prvého prvku v kolekcii.
- Nevytvárame objekty Enumeration, Iterator, ListIterator, pretože sú to rozhrania. Na vytváranie objektov používame metódy ako elements(), iterator(), listIterator(). Tieto metódy majú anonym Vnútorná trieda ktorý rozširuje príslušné rozhrania a vracia tento objekt triedy.
Poznámka: The $ symbol v názve referenčnej triedy je dôkazom toho, že sa používa koncept vnútorných tried a tieto objekty triedy sú vytvorené.
Dá sa to overiť nižšie uvedeným kódom. Viac informácií o vnútornej triede nájdete
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()); } }> Výkon
java.util.Vector java.util.Vector$Itr java.util.Vector$ListItr>
Vysvetlenie
V Jave je iterátor rozhranie, ktoré sa používa na prechádzanie cez kolekciu objektov jeden po druhom. Používa sa na iteráciu cez akúkoľvek dátovú štruktúru založenú na kolekcii, vrátane polí, zoznamov, množín a máp.
Iterátor má tri hlavné metódy, ktoré sa používajú na prechádzanie kolekciou:
- hasNext() – Táto metóda kontroluje, či je v kolekcii ďalší prvok, ktorý je možné opakovať.
- next() – Táto metóda vráti ďalší prvok v kolekcii.
- remove() – Táto metóda odstráni aktuálny prvok z kolekcie.
Rozhranie Iterator je súčasťou Java Collection Framework a je implementované triedami, ktoré reprezentujú rôzne typy kolekcií.
Program
Java import java.util.ArrayList; import java.util.Iterator; public class IteratorExample { public static void main(String[] args) { ArrayListmená = nový ArrayList(); mená.add('Alice'); mená.add('Bob'); mená.add('Charlie'); mená.add('David'); // Vytvorenie iterátora pre zoznam mien Iteratoriterator = names.iterator(); // Iterácia cez zoznam mien pomocou iterátora while (iterator.hasNext()) { String name = iterator.next(); System.out.println(meno); } } }> Výkon
Alice Bob Charlie David>
V tomto príklade sme vytvorili ArrayList reťazcov a pridali sme k nemu štyri názvy. Potom sme vytvorili iterátor pre zoznam pomocou metódy iterator() triedy ArrayList. Použili sme metódu hasNext() na kontrolu, či je v zozname viac prvkov, ktoré sa majú iterovať, a metódu next() na získanie ďalšieho prvku v zozname. Každý prvok sme vytlačili pomocou metódy System.out.println().
Použitie iterátora na prechádzanie kolekciou je pohodlný a efektívny spôsob iterácie kolekciou, pretože umožňuje iteráciu kolekcie bez znalosti vnútornej štruktúry kolekcie. Umožňuje tiež odstránenie prvkov z kolekcie pri jej opakovaní.
Výhody Iterátora v Jave:
- Iterátor je jednoduché a ľahko použiteľné rozhranie, ktoré nám umožňuje prechádzať kolekciou bez odhalenia jej základnej implementácie.
- Iterátor je efektívny spôsob iterácie kolekcie, najmä ak máme veľké množstvo údajov.
- Iterátor poskytuje bezpečný spôsob odstraňovania prvkov z kolekcie počas iterácie bez toho, aby spôsobil akékoľvek súbežné výnimky modifikácie.
- Rozhranie Iterator je implementované všetkými triedami kolekcií v jazyku Java, takže môžeme použiť rovnaký kód na iteráciu rôznych typov kolekcií.
Nevýhody Iterátora v Jave:
Používanie Iterátora v Jave má určité nevýhody, ako je uvedené nižšie:
- Iterátor je jednosmerné rozhranie, čo znamená, že vpred sa môžeme pohybovať len cez kolekciu. Nemôžeme sa posunúť dozadu alebo preskočiť na konkrétny prvok.
- Iterátor nie je bezpečný pre vlákna, takže ho nemôžeme použiť na iteráciu kolekcie vo viacvláknovom prostredí bez správnej synchronizácie.
- Iterátor neposkytuje žiadny mechanizmus na úpravu prvkov počas iterácie kolekcie, okrem odstraňovania prvkov. Ak potrebujeme upraviť prvky, musíme použiť iné rozhrania ako ListIterator alebo jednoduchý cyklus for.