java iterator learn use iterators java with examples
V tomto výukovém programu se dozvíte něco o iterátorech v Javě. Budeme mít podrobnou diskusi o rozhraních Iterator And ListIterator v Javě:
Prozkoumali jsme vše o prostředí Java Collection Framework a jeho různých podpůrných rozhraních a třídách v jednom z našich předchozích kurzů.
Pokud máte kolekci, chcete získat přístup k jejím prvkům, přidat / odebrat nebo zpracovat prvky. Chcete-li toto všechno zpracovat prostřednictvím programu Java, měli byste být schopni procházet kolekcí, kterou používáte. Zde přichází do obrazu iterátor.
Co se naučíte:
- Co je Java Iterator?
- Závěr
Co je Java Iterator?
V Javě je Iterátor konstrukce, která se používá k procházení nebo procházení kolekce.
Chcete-li použít Iterátor, musíte objekt iterátoru získat pomocí „ iterátor () “ metoda sběrného rozhraní. Java Iterator je rozhraní rámce kolekce a je součástí balíčku „java.util“. Pomocí Java Iterator můžete iterovat sbírkou objektů.
Rozhraní Java Iterator nahrazuje enumerátor, který byl dříve použit k procházení několika jednoduchých sbírek, jako jsou vektory.
Hlavní rozdíly mezi Java Iterator a Enumerator jsou:
- Značné zlepšení v názvech metod.
- Můžete odebrat prvky metody z kolekce, která se prochází pomocí iterátoru.
V tomto kurzu probereme podrobnosti o rozhraní Iterator a rozhraní ListIterator, které je obousměrným rozhraním.
Typy iterátorů
- Enumerátor
- Iterátor
- ListIterator
Enumerátor je nyní zřídka používán. Proto se v naší sérii kurzů zaměříme na rozhraní Iterator a ListIterator.
Iterátorové rozhraní v Javě
Rozhraní Iterator v Javě je součástí rámce Collections v balíčku „java.util“ a je kurzorem, kterým lze procházet kolekcí objektů.
Rozhraní Iterator má následující hlavní vlastnosti:
- Rozhraní Iterator je k dispozici od rámce kolekce Java 1.2.
- Prochází kolekcí předmětů jeden po druhém.
- Populárně známý jako „Universal Java Cursor“, protože pracuje se všemi sbírkami.
- Toto rozhraní podporuje operace „čtení“ a „odebrání“, tj. Prvek můžete během iterace odebrat pomocí iterátoru.
Obecné zastoupení rozhraní Iterator je uvedeno níže:
Dále se podívejme na výše uvedené metody Iterator.
Iterátorové metody
Rozhraní Iterator podporuje následující metody:
# 1) Další ()
Prototyp: E další ()
Parametry: žádné parametry
Typ vrácení: E -> prvek
Popis: Vrátí další prvek v kolekci.
Pokud iterace (kolekce) nemá žádné další prvky, hodí se NoSuchElementException .
# 2) hasNext ()
Prototyp: boolean hasNext ()
Parametry: NULA
Typ vrácení: true => v kolekci jsou prvky.
False => žádné další prvky
Popis: Funkce hasNext () kontroluje, zda je v kolekci, ke které se přistupuje pomocí iterátoru, více prvků. Pokud již neexistují žádné další prvky, nevoláte metodu next (). Jinými slovy, tuto funkci lze použít k rozhodnutí, zda má být volána metoda next ().
# 3) odebrat ()
Prototyp: void remove ()
Parametry: NULA
Typ vrácení: NULA
Popis: Odebere poslední prvek vrácený iterátorem iterujícím přes podkladovou kolekci. Metodu remove () lze volat pouze jednou za volání next ().
Pokud iterátor nepodporuje operaci odebrání, hodí UnSupportedOperationException . Hází to IllegalStateException pokud ještě není volána další metoda.
# 4) forEachRemaining ()
Prototyp: void forEachRemaining (spotřebitel super JE > akce)
Parametry: action => akce, kterou je třeba provést
Typ vrácení: prázdnota
Popis: Provede zadanou akci na každém ze zbývajících prvků kolekce, dokud nebudou vyčerpány všechny prvky nebo akce vyvolá výjimku. Výjimky vyvolané akcí se šíří volajícímu.
Pokud je akce nulová, pak se zvýší nullPointerException . Tato funkce je novým přírůstkem do rozhraní Iterator v Javě 8.
Příklad Java Iterator
Implementujme program Java, abychom demonstrovali použití rozhraní Iterator. Následující program vytvoří ArrayList květin. Pak získá iterátor pomocí metody iterator () ArrayList. Poté se prochází seznamem, aby se zobrazil každý prvek.
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() + ' '); } } }
Výstup:
Omezení Iterátorového rozhraní
- S tímto Iterátorem nelze provést operaci nahrazení prvku nebo přidání nového prvku.
- Iterace probíhá pouze v jednom směru, tj. Dopředu.
- Podporuje pouze sekvenční iteraci.
- Pokud mají být iterovány velké objemy dat, je ovlivněn výkon Iterátoru.
Iterator VsIterable
Ačkoli rozhraní Iterable a Iterator zní podobně, jsou úplně jiná. Třída, která implementuje Iterable rozhraní, získává schopnost iterovat přes objekty třídy, které používají rozhraní iterátoru.
Níže jsou uvedeny některé hlavní rozdíly mezi těmito dvěma rozhraními, kterých si musíte být vědomi:
Iterovatelné rozhraní | Iterátorové rozhraní |
---|---|
Představuje kolekci, kterou lze procházet pomocí smyčky foreach. | Umožňuje iteraci nad nějakou jinou kolekcí. |
Třída, která implementuje iterovatelné rozhraní, musí přepsat metodu iterator (). | metody hasNext () a next () rozhraní Iterator mají být přepsány implementací třídy. |
Neukládá aktuální stav. | Ukládá aktuální stav iterace. |
Instance rozhraní iterátoru by měla být vytvořena při každém volání metody iterator (). | Žádná taková smlouva pro rozhraní iterátoru. |
Pohybuje se pouze dopředu. | Pohyby ve směru dopředu a dílčí rozhraní, jako je listIterator, podporují obousměrné procházení. |
Neposkytuje žádnou metodu pro úpravu prvků během iterace. | Poskytuje metodu remove, která může odebrat prvek, když probíhá iterace. |
Rozhraní ListIterator v Javě
Rozhraní ListIterator je podrozhraní iterátorového rozhraní. Funguje na kolekcích typů seznamů, jako jsou Linkedlists, seznamy polí atd. Toto rozhraní tedy překonává nedostatky rozhraní Iterator.
Mezi hlavní vlastnosti rozhraní ListIterator patří:
- Rozhraní ListIterator rozšiřuje rozhraní Iterator.
- Rozhraní ListIterator podporuje operace CRUD, tj. Vytváření, čtení, aktualizaci a mazání.
- Podporuje iteraci ve směru dopředu i dozadu.
- Protože toto rozhraní je obousměrné, je kurzor vždy umístěn mezi předchozím a dalším prvkem.
- Toto rozhraní funguje hlavně pro implementace seznamu jako ArrayList, LinkedList atd.
- K dispozici od verze Java 1.2
Rozhraní ListIterator je znázorněno níže:
Jak již bylo zmíněno, rozhraní ListIterator rozšiřuje rozhraní Iterator. Kromě podpory všech metod iterátorového rozhraní, jak je znázorněno výše, má rozhraní ListIterator také vlastní metody, které mu pomáhají provádět operace CRUD i obousměrnou iteraci.
Pojďme si podrobně promluvit o metodách ListIterator.
Metody ListIterator
Všimněte si, že metody rozhraní Iterator, next (), hasNext () a remove () fungují přesně stejným způsobem jako rozhraní ListIterator. Proto v této části tyto metody přeskočíme. Kromě výše uvedených metod má ListIterator následující metody -
Předchozí()
Prototyp: E předchozí ()
Parametry: NULA
Typ vrácení:
E- předchozí prvek v seznamu.
- 1 - pokud je iterátor na začátku seznamu.
Popis: Tato funkce vrací předchozí prvek v seznamu. Po vrácení předchozího prvku se kurzor přesune zpět na další prvek.
hasPrevious ()
Prototyp: boolean hasPrevious ()
Parametry: NULA
Typ vrácení: true => iterátor má více prvků, když je seznam posunut dozadu.
Popis: Tato funkce kontroluje, zda ListIterator má více prvků ve zpětném směru.
previousIndex
Prototyp: int previousIndex ()
Parametry: NULA
Typ vrácení:
int - index předchozího prvku
- 1 - pokud je ukazatel na začátku seznamu.
Popis: Vrátí index předchozího prvku, který je vrácen předchozím () voláním.
nextIndex
Prototyp: int nextIndex ()
Parametry: NULA
Typ vrácení:
int - další index
- 1 - pokud je iterátor na konci seznamu.
Popis: Vrátí další index prvku v seznamu. Tento prvek je vrácen voláním metody next ().
soubor()
Prototyp: neplatná sada (E a)
Parametry: e - prvek, který má být nahrazen
Typ vrácení: NULA
Popis: Slouží k nahrazení posledního prvku daným prvkem e.
přidat()
Prototyp: void add (E e)
Parametry: e - prvek, který se má přidat
Typ vrácení: NULA
Popis: Přidá nové prvky do seznamu na pozici před následujícím () prvkem.
Seznam příkladů iterátoru
Nyní víme, co je ListIterator a jaké jsou různé metody, které podporuje. Pojďme si představit ListIterator a implementovat program Java.
V tomto programu jsme použili ArrayList. Pak použijeme metody ListIterator k procházení seznamu dopředu i dozadu a zobrazení výstupu.
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()+' '); } }
Výstup:
Zatím jsme diskutovali o rozhraních, iterátoru a Listiterátoru, dále uvidíme různé příklady použití těchto rozhraní k procházení různých kolekcí. Nejprve se ale podívejme na procházení jednoduchými poli a pak přejdeme k dalším sbírkám.
Pole Iterator
V Javě existují dva způsoby, jak iterovat přes prvky pole. Popíšeme způsoby pomocí příkladů kódu.
# 1) pro smyčku
Toto je nejjednodušší způsob iterace přes pole. Používáme jednoduchou smyčku for, která zvýší index s každou iterací a zobrazí jeho obsah.
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 Výstup:
Výše uvedený program zobrazuje obsah pole pomocí smyčky for.
# 2) forEach loop
Toto je druhý způsob, jak iterovat nad poli. Zde používáme specializovanou smyčku for nebo smyčku forEach. Zde procházíme pole pro každý prvek a poté zobrazíme obsah.
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 + ' '); } } }
Výstup:
ForEach je ve srovnání se smyčkou for optimalizován více. Je kratší na psaní a je také rychlejší.
ArrayList Iterator
V případě, že chcete procházet kolekcí ArrayList, můžete tak učinit pomocí rozhraní Iterator. Jelikož iterátor je rozhraní, nemůžete jej vytvořit okamžitě. Místo toho můžete použít metodu iterátoru () kolekce ArrayList k získání iterátoru a následnému procházení seznamu.
Iterátor iterátor ();
Příklad pro demonstraci ArrayList Iterator.
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() + ' '); } }
Výstup:
LinkedList Iterator
Nyní se podívejme na funkčnost iterátoru v případě kolekce LinkedList.
Kolekce LinkedList podporuje metodu listIterator (), která vrací listIterator k procházení propojeným seznamem.
Obecný formát této funkce je
ListIterator list_iter = LinkedList.listIterator (int index);
Zde je index celočíselná hodnota, která určuje pozici v kolekci propojených seznamů, odkud by měl začít procházet.
Pojďme pochopit iterátor seznamu v propojeném seznamu s ukázkovým programem. Upravili jsme stejný program iterátoru polí a změnili jej tak, aby obsahoval listiterátor s 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() + ' '); } }
Výstup:
vložte uzel do binárního stromu java
Iterátor Java Map / Hashmap
Mapa nebo její varianty jako hashmap, treemap atd. Nejsou sbírky. Proto na něm nemůžete přímo použít metodu iterátoru. Místo toho byste měli iterovat nad hodnotami zadávání klíčů a číst páry klíč / hodnota.
I když můžete k iteraci přes hodnoty mapy použít různé metody, jako je forEach, for loop atd., Nejlepší a efektivní metodou je iterace pomocí iterátorů pomocí klíčových hodnot. Kromě toho můžete během iterace také odebrat položky z mapy pomocí metody remove.
Příklad použití Iterátoru s 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()); } } }
Výstup:
Ve výše uvedeném programu jsme definovali mapu s celočíselnými klíči a hodnotami typu řetězce. Poté definujeme iterátor nad mapou. Zadejte a zobrazte páry klíč / hodnota.
Java Set Iterator
Metoda iterator () souboru Java.util.set se používá k získání iterátoru, který vrací prvky v sadě v náhodném pořadí.
Iterator set_iterator = Set.iterator();
„Set_iterator“ iteruje různé prvky sady a vrací jejich hodnoty.
Podobným způsobem obsahuje hash sada také funkci iterátoru, která vrací iterátor jako set iterátor.
Iterator hashset_iterator = Hash_Set.iterator();
Níže je uveden příklad programování k demonstraci nastaveného iterátoru.
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()); } } }
Výstup:
Tato implementace používá HashSet iterátor a zobrazuje jednotlivé hodnoty iterací nad prvky HashSet.
Iterator vs ListIterator
Uveďme tabulku hlavních rozdílů mezi rozhraními Iterator a ListIterator.
Iterátor ListIterator Může procházet všechny sbírky včetně sady, mapy atd. Lze jej použít k procházení pouze kolekce typů seznamu jako ArrayList, LinkedList. Iteruje kolekci pouze směrem dopředu. Může iterovat po kolekci dopředu i dozadu. Nelze získat indexy. Může získat indexy. Žádný způsob přidání nových prvků do kolekce. Do kolekce můžete přidat nové prvky. Iterátor nemůže během iterace prvky upravovat. ListIterator může upravovat prvky v kolekci pomocí metody set ().
Často kladené otázky
Otázka č. 1) Co je iterace v Javě?
Odpovědět: Iterace je proces, při kterém se blok kódu opakovaně spouští, dokud daná podmínka nebude platit nebo neexistuje. Pomocí iterace můžete procházet posloupností prvků nebo zpracovávat data.
Otázka 2) Kolik typů iterátorů je v Javě?
Odpovědět: Iterátory se používají k procházení sbírek v Javě.
V Javě existují tři typy iterátorů:
- Enumerátoři
- Iterátory
- ListIterátory
Otázka č. 3) Jak mohu použít Iterátor v Javě?
Odpovědět: Chcete-li použít iterátor k procházení kolekcí, musíte nejprve získat iterátor pomocí metody iterator () určené kolekce.
Poté můžete k získání prvku použít metody hasNext () a next () iterátoru.
Otázka č. 4) Proč se místo smyčky for používá Iterator?
Odpovědět: Iterátor i smyčka for se používají k opakovanému provádění konkrétního bloku kódu. Ale hlavní rozdíl je v tom, že ve smyčce for nemůžete měnit ani upravovat obsah kolekce. I když se pokusíte upravit, vyvolá concurrentModificationException. Pomocí iterátoru můžete odebrat prvek z kolekce.
Otázka č. 5) Proč potřebujeme Iterator v Javě?
Odpovědět: Iterátor vám pomůže načíst prvky v kolekci nebo kontejneru, aniž by programátor musel znát vnitřní strukturu nebo fungování kolekce. Jsou elegantnější, spotřebovávají méně paměti a programátor je také ušetřen při psaní zdlouhavého kódu.
Za druhé mohou být prvky uloženy v kolekci jakýmkoli způsobem, ale pomocí iterátoru je programátor může načíst stejně jako seznam nebo jakoukoli jinou sekvenci.
Závěr
V tomto kurzu jsme probrali iterátory v Javě, které se používají u kolekcí. Tato znalost iterátorů pomůže čtenářům uchopit sbírky, které se v následujících výukách naučíme.
Doporučené čtení
- Výukový program pro rozhraní Java a abstraktní třídu s příklady
- Výukový program JAVA pro začátečníky: 100+ praktických výukových programů Java Video
- Implementace Java: Vytvoření a spuštění souboru Java JAR
- Java „toto“ klíčové slovo: Výukový program s příklady kódu
- Virtuální stroj Java: Jak JVM pomáhá při spouštění aplikace Java
- Modifikátory přístupu v Javě - výuka s příklady
- Výukový program Java Reflection s příklady
- C ++ Vs Java: Top 30 rozdílů mezi C ++ a Java s příklady