java iterator learn use iterators java with examples
このチュートリアルでは、Javaのイテレータについて学習します。 JavaのIteratorおよびListIteratorインターフェースについて詳細に説明します。
以前のチュートリアルの1つで、Javaコレクションフレームワークとそのさまざまなサポートインターフェイスおよびクラスについてすべて調べました。
コレクションがある場合は、その要素にアクセスしたり、要素を追加/削除または処理したりします。 Javaプログラムを介してこのすべての処理を実行するには、使用しているコレクションをトラバースできる必要があります。ここでイテレータが登場します。
学習内容:
Javaイテレータとは何ですか?
Javaでは、イテレータはコレクションをトラバースまたはステップスルーするために使用される構造です。
イテレータを使用するには、「」を使用してイテレータオブジェクトを取得する必要があります。 iterator()」 コレクションインターフェイスのメソッド。 Java Iteratorは、コレクションフレームワークインターフェイスであり、「java.util」パッケージの一部です。 Java Iteratorを使用すると、オブジェクトのコレクションを反復処理できます。
Java Iteratorインターフェースは、ベクトルのようないくつかの単純なコレクションをステップスルーするために以前に使用された列挙子を置き換えます。
JavaIteratorとEnumeratorの主な違いは次のとおりです。
- メソッド名の大幅な改善。
- イテレータを使用して、トラバースされているコレクションからメソッド要素を削除できます。
このチュートリアルでは、Iteratorインターフェースと双方向インターフェースであるListIteratorインターフェースの詳細について説明します。
イテレータタイプ
- 列挙子
- イテレータ
- ListIterator
現在、列挙子はほとんど使用されていません。したがって、チュートリアルシリーズでは、IteratorインターフェイスとListIteratorインターフェイスに焦点を当てます。
Javaのイテレータインターフェイス
JavaのIteratorインターフェースは、「java.util」パッケージのCollectionsフレームワークの一部であり、オブジェクトのコレクションをステップスルーするために使用できるカーソルです。
Iteratorインターフェースには、次の主要な特性があります。
- Iteratorインターフェースは、Java1.2コレクションフレームワーク以降から利用できます。
- オブジェクトのコレクションを1つずつトラバースします。
- すべてのコレクションで機能するため、一般に「ユニバーサルJavaカーソル」として知られています。
- このインターフェースは「読み取り」および「削除」操作をサポートします。つまり、イテレーターを使用して反復中に要素を削除できます。
イテレータインターフェイスの一般的な表現を以下に示します。
次に、上記のIteratorメソッドを見てみましょう。
イテレータメソッド
Iteratorインターフェースは、以下のメソッドをサポートします。
#1)Next()
プロトタイプ: E次()
パラメーター: パラメータなし
戻り値の型: E->要素
説明: コレクション内の次の要素を返します。
反復(コレクション)にこれ以上要素がない場合は、 NoSuchElementException 。
#2)hasNext()
プロトタイプ: ブールhasNext()
パラメーター: NIL
戻り値の型: true =>コレクションに要素があります。
False =>これ以上要素はありません
説明: 関数hasNext()は、イテレーターを使用してアクセスされているコレクションにさらに要素があるかどうかを確認します。これ以上要素がない場合は、next()メソッドを呼び出さないでください。つまり、この関数を使用して、next()メソッドを呼び出すかどうかを決定できます。
#3)remove()
プロトタイプ: void remove()
パラメーター: NIL
戻り値の型: NIL
説明: 基になるコレクションを反復処理するイテレータによって返される最後の要素を削除します。 remove()メソッドは、次の()呼び出しごとに1回だけ呼び出すことができます。
イテレータが削除操作をサポートしていない場合、イテレータはスローします UnSupportedOperationException 。投げる IllegalStateException 次のメソッドがまだ呼び出されていない場合。
#4)forEachRemaining()
プロトタイプ: void forEachRemaining(consumer super IS >アクション)
パラメーター: アクション=>実行するアクション
戻り値の型: ボイド
説明: すべての要素が使い果たされるか、アクションが例外をスローするまで、コレクションの残りの各要素に対して指定されたアクションを実行します。アクションによってスローされた例外は、呼び出し元に伝播されます。
アクションがnullの場合、発生します nullPointerException 。この関数は、Java8のIteratorインターフェースに新しく追加されたものです。
Javaイテレータの例
Iteratorインターフェースの使用法を示すJavaプログラムを実装しましょう。次のプログラムは、花のArrayListを作成します。次に、ArrayListのiterator()メソッドを使用してイテレーターを取得します。その後、リストをトラバースして各要素を表示します。
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() + ' '); } } }
出力:
イテレータインターフェイスの制限
- このイテレータでは、要素を置き換えたり、新しい要素を追加したりする操作は実行できません。
- 反復は一方向、つまり順方向にのみ進行します。
- 順次反復のみをサポートします。
- 大量のデータを反復処理する場合、イテレータのパフォーマンスが影響を受けます。
イテレータ対反復可能
IterableとIteratorのインターフェースは似ていますが、完全に異なります。 Iterableインターフェイスを実装するクラスは、イテレータインターフェイスを使用するクラスオブジェクトを反復処理する機能を取得します。
以下に、注意しなければならないこれら2つのインターフェースの主な違いのいくつかを示します。
反復可能なインターフェース | イテレータインターフェイス |
---|---|
foreachループを使用してトラバースできるコレクションを表します。 | 他のコレクションを反復処理できます。 |
iterableインターフェースを実装するクラスは、iterator()メソッドをオーバーライドする必要があります。 | IteratorインターフェースのhasNext()およびnext()メソッドは、それを実装するクラスによってオーバーライドされます。 |
現在の状態を保存しません。 | 反復の現在の状態を格納します。 |
iterator()メソッドが呼び出されるたびに、イテレータインターフェイスのインスタンスを生成する必要があります。 | イテレータインターフェイスのそのような契約はありません。 |
順方向にのみ移動します。 | 順方向に移動し、listIteratorなどのサブインターフェイスは双方向トラバースをサポートします。 |
反復中に要素を変更するメソッドを提供しません。 | 反復の進行中に要素を削除できるremoveメソッドを提供します。 |
JavaのListIteratorインターフェイス
インターフェイスListIteratorは、イテレータインターフェイスのサブインターフェイスです。リンクリスト、配列リストなどのリストタイプのコレクションで機能します。したがって、このインターフェイスはIteratorインターフェイスの欠点を克服します。
ListIteratorインターフェースの主な特徴は次のとおりです。
- ListIteratorインターフェースは、Iteratorインターフェースを拡張します。
- ListIteratorインターフェースは、CRUD操作(作成、読み取り、更新、削除)をサポートします。
- 順方向と逆方向の反復をサポートします。
- このインターフェイスは双方向であるため、カーソルは常に前の要素と次の要素の間に配置されます。
- このインターフェースは、主にArrayList、LinkedListなどのリスト実装で機能します。
- Java1.2以降で使用可能
インターフェイスListIteratorは、次のように表されます。
すでに述べたように、ListIteratorインターフェースはIteratorインターフェースを拡張します。したがって、上記のように、イテレータインターフェイスのすべてのメソッドをサポートするほかに、ListIteratorインターフェイスには、CRUD操作と双方向反復の実行に役立つ独自のメソッドもあります。
ListIteratorメソッドについて詳しく説明します。
ListIteratorメソッド
Iteratorインターフェイスメソッドのnext()、hasNext()、およびremove()は、ListIteratorインターフェイスとまったく同じように機能することに注意してください。したがって、このセクションではこれらのメソッドをスキップします。上記のメソッドに加えて、ListIteratorには次のメソッドがあります-
前()
プロトタイプ: E previous()
パラメーター: NIL
戻り値の型:
E-リスト内の前の要素。
- 1 –イテレータがリストの先頭にある場合。
説明: この関数は、リスト内の前の要素を返します。前の要素が返されると、カーソルは次の要素に戻ります。
hasPrevious()
プロトタイプ: ブール値hasPrevious()
パラメーター: NIL
戻り値の型: true =>リストを逆方向にトラバースすると、イテレータにはより多くの要素があります。
説明: この関数は、ListIteratorに逆方向にさらに要素があるかどうかをチェックします。
previousIndex
プロトタイプ: int previousIndex()
パラメーター: NIL
戻り値の型:
int –前の要素のインデックス
- 1 –ポインタがリストの先頭にある場合。
説明: previous()呼び出しによって返される前の要素のインデックスを返します。
nextIndex
プロトタイプ: int nextIndex()
パラメーター: NIL
戻り値の型:
int –次のインデックス
- 1 –イテレータがリストの最後にある場合。
説明: リスト内の要素の次のインデックスを返します。この要素は、next()メソッドの呼び出しによって返されます。
セットする()
プロトタイプ: ボイドセット(Eおよび)
パラメーター: e –交換する要素
戻り値の型: NIL
説明: 最後の要素を指定された要素に置き換えるために使用されますe。
追加()
プロトタイプ: void add(E e)
パラメーター: e –追加する要素
戻り値の型: NIL
説明: next()要素の前の位置でリストに新しい要素を追加します。
リストイテレータの例
これで、ListIteratorとは何か、およびListIteratorでサポートされているさまざまなメソッドは何かがわかりました。先に進んで、ListIteratorをデモンストレーションするJavaプログラムを実装しましょう。
このプログラムでは、ArrayListを使用しました。次に、ListIteratorメソッドを使用して、リストを順方向と逆方向にトラバースし、出力を表示します。
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()+' '); } }
出力:
これまで、インターフェース、イテレーター、およびListiteratorについて説明してきました。次に、これらのインターフェースを使用してさまざまなコレクションをトラバースするさまざまな例を示します。ただし、最初に、単純な配列のトラバースを調べてから、他のコレクションに移りましょう。
配列イテレータ
Javaでは、配列要素を反復処理する方法が2つあります。コード例を使用して方法を説明しましょう。
#1)forループ
これは、配列を反復処理する最も簡単な方法です。反復ごとにインデックスをインクリメントし、その内容を表示する単純なforループを使用します。
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 出力:

上記のプログラムは、forループを使用して配列の内容を表示します。
#2)forEachループ
これは、配列を反復処理する2番目の方法です。ここでは、特殊なforループまたは「forEach」ループを使用します。ここでは、各要素の配列をループして、内容を表示します。
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 + ' '); } } }
出力:

forEachは、forループと比較してより最適化されています。入力するのが短く、高速です。
ArrayListイテレータ
ArrayListコレクションをトラバースする場合は、Iteratorインターフェイスを使用して行うことができます。イテレータはインターフェイスであるため、直接インスタンス化することはできません。代わりに、ArrayListコレクションのイテレータ()メソッドを使用してイテレータを取得し、リストをトラバースできます。
イテレータiterator();
ArrayListイテレータを示す例。
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() + ' '); } }
出力:

LinkedListイテレータ
LinkedListコレクションの場合のイテレータの機能を見てみましょう。
LinkedListコレクションは、listIteratorを返し、リンクリストをトラバースするlistIterator()メソッドをサポートします。
この関数の一般的な形式は次のとおりです。
ListIterator list_iter = LinkedList.listIterator(int index);
ここで、インデックスは、トラバースを開始するリンクリストコレクション内の位置を指定する整数値です。
サンプルプログラムを使用して、リンクリスト内のリストイテレータを理解しましょう。同じ配列イテレータプログラムを変更し、LinkedListを持つlistiteratorを含むように変更しました。
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() + ' '); } }
出力:
.jarファイルを起動する方法

Javaマップ/ハッシュマップイテレータ
マップまたはハッシュマップ、ツリーマップなどのバリエーションはコレクションではありません。したがって、イテレータメソッドを直接使用することはできません。代わりに、キー入力値を繰り返し処理して、キーと値のペアを読み取る必要があります。
forEach、forループなどのさまざまな方法を使用してマップ値を反復処理できますが、イテレーターを使用してキー値を反復処理するのが最良かつ効率的な方法です。さらに、removeメソッドを使用して、反復中にマップからエントリを削除することもできます。
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()); } } }
出力:

上記のプログラムでは、整数キーと文字列型の値を使用してマップを定義しました。次に、マップ上にイテレータを定義します。キーと値のペアを入力して表示します。
Javaセットイテレータ
Java.util.setのiterator()メソッドは、セット内の要素をランダムな順序で返すイテレーターを取得するために使用されます。
Iterator set_iterator = Set.iterator();
「set_iterator」は、セットのさまざまな要素を反復処理し、それらの値を返します。
同様に、ハッシュセットには、セットイテレータのようなイテレータを返すイテレータ関数も含まれています。
Iterator hashset_iterator = Hash_Set.iterator();
以下に、セットイテレータを示すプログラミング例を示します。
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()); } } }
出力:

この実装では、 HashSetイテレータ HashSet要素を反復処理することにより、個々の値を表示します。
イテレータとListIterator
IteratorインターフェースとListIteratorインターフェースの主な違いを表にまとめましょう。
イテレータ ListIterator セット、マップなどを含むすべてのコレクションをトラバースできます。 ArrayList、LinkedListなどのリストタイプのコレクションのみをトラバースするために使用できます。 コレクションを順方向にのみ繰り返します。 コレクションを順方向と逆方向に繰り返すことができます。 インデックスを取得できません。 インデックスを取得できます。 コレクションに新しい要素を追加する方法はありません。 コレクションに新しい要素を追加できます。 イテレータは、反復中に要素を変更できません。 ListIteratorは、set()メソッドを使用してコレクション内の要素を変更できます。
よくある質問
Q#1)Javaの反復とは何ですか?
回答: 反復とは、特定の条件が成立するか存在しなくなるまで、コードブロックが繰り返し実行されるプロセスです。反復を使用すると、一連の要素をトラバースしたり、データを処理したりできます。
Q#2)Javaには何種類のイテレータがありますか?
回答: イテレータは、Javaのコレクションをトラバースするために使用されます。
Javaには3つのタイプのイテレータがあります。
- 列挙子
- イテレータ
- ListIterators
Q#3)Javaでイテレータを使用するにはどうすればよいですか?
回答: イテレータを使用してコレクションをトラバースするには、まず、指定されたコレクションのiterator()メソッドを使用してイテレータを取得する必要があります。
次に、イテレータのhasNext()メソッドとnext()メソッドを使用して、要素を取得できます。
Q#4)forループの代わりにイテレータが使用されるのはなぜですか?
回答: イテレータとforループの両方を使用して、特定のコードブロックを繰り返し実行します。ただし、主な違いは、forループでは、コレクションの内容を変更または変更できないことです。変更しようとしても、concurrentModificationExceptionがスローされます。イテレータを使用すると、コレクションから要素を削除できます。
Q#5)JavaでIteratorが必要なのはなぜですか?
回答: イテレータは、プログラマがコレクションの内部構造や動作を知らなくても、コレクションまたはコンテナ内の要素を取得するのに役立ちます。それらはよりエレガントで、より少ないメモリを消費し、またプログラマーは長いコードを書くことを免れます。
次に、要素は任意の方法でコレクションに格納できますが、イテレーターを使用すると、プログラマーはリストやその他のシーケンスと同じように要素を取得できます。
結論
このチュートリアルでは、コレクションで使用されるJavaのイテレーターについて説明しました。イテレータに関するこの知識は、読者が後続のチュートリアルで学習するコレクションを把握するのに役立ちます。
推奨読書