logo

Javaのイテレータ

Java カーソルはイテレータであり、Collection または Stream オブジェクトの要素を 1 つずつ反復、走査、取得するために使用されます。この記事では、Java イテレータとその動作について学びます。

Java カーソル

Java のカーソルの種類

がある 以下に示す Java の 3 つのカーソル:

  1. イテレーター
  2. 列挙
  3. リスト反復子

注記: SplitIterator は Iterator の一種であるため、カーソルとみなすこともできます。



1. イテレータ

Java のイテレータは以下で使用されます。 収集フレームワーク 要素を 1 つずつ取得します。それは 普遍的な 任意の Collection オブジェクトに適用できるため、イテレータを使用します。 Iterator を使用すると、読み取り操作と削除操作の両方を実行できます。これは、要素を削除する追加機能を備えた Enumeration の改良版です。

Set、List、Queue、Deque などのすべての Collection フレームワーク実装インターフェイス、および Map インターフェイスのすべての実装クラスで要素を列挙する場合は、必ず Iterator を使用する必要があります。イテレータは のみ カーソルはコレクション フレームワーク全体で使用できます。イテレータ オブジェクトは、 イテレータ() Collection インターフェースに存在するメソッド。

構文

Iterator itr = c.  iterator  ();>

注記: ここで、 c は任意の Collection オブジェクトです。 itr は Iterator インターフェイス型で、c を参照します。

C++のxor

Java のイテレータ インターフェイスのメソッド

イテレータインターフェイスは以下を定義します 三つ 以下にリストされている方法:

1.hasNext(): 反復にさらに多くの要素がある場合は true を返します。

public boolean hasNext();>

2.next(): 反復内の次の要素を返します。それは投げます NoSuchElementException それ以上の要素が存在しない場合。

public Object next();>

3. 削除(): 反復内の次の要素を削除します。このメソッドは、next() の呼び出しごとに 1 回だけ呼び出すことができます。

public void remove();>

注記: 取り除く() このメソッドは次の 2 つの例外をスローする可能性があります。

  • UnsupportedOperationException : 削除操作がこのイテレータでサポートされていない場合
  • IllegalStateException : 次のメソッドがまだ呼び出されていないか、次のメソッドの最後の呼び出し後に削除メソッドがすでに呼び出されている場合。

Java イテレータは内部的にどのように動作しますか?

このセクションでは、Java Iterator とそのメソッドが内部でどのように動作するかを理解しようとします。この機能を理解するために、次の LinkedList オブジェクトを取り上げてみましょう。

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

次に、以下に示すように、List オブジェクト上に Iterator オブジェクトを作成しましょう。

Iterator citiesIterator = cities.iterator();>

cityIteartor イテレータは次のようになります –

Java イテレータ ステップ 1

ここで、イテレータのカーソルはリストの最初の要素の前を指しています。

ここで、次のコード スニペットを実行します。

citiesIterator.hasNext(); citiesIterator.next();>
Java イテレータ ステップ 2

上記のコード スニペットを実行すると、上の図に示すように、Iterator のカーソルはリストの最初の要素を指します。

ここで、次のコード スニペットを実行します。

citiesIterator.hasNext(); citiesIterator.next();>
Java イテレータ ステップ 3

上記のコード スニペットを実行すると、上の図に示すように、Iterator のカーソルはリストの 2 番目の要素を指します。このプロセスを実行して、イテレータのカーソルをリストの最後の要素に到達させます。

Java イテレータのステップ n

最後の要素を読み取った後、以下のコード スニペットを実行すると、false 値が返されます。

citiesIterator.hasNext();>
最後のJavaイテレータ

Iterator の Cursor が List の最後の要素の後ろを指しているため、hasNext() メソッドは false 値を返します。

注記: これらすべての図を観察すると、以下の図に示すように、Java Iterator は前方向反復のみをサポートしていると言えます。そのため、単方向カーソルとも呼ばれます。

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 = 新しい ArrayList (); // リストを反復処理します for (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(); // hasnext() メソッドを使用して List 内に // 単一の要素が存在するまで条件が成立する次の要素をチェックします // while (itr.hasNext()) { // カーソルを次の要素に移動 int i = itr.next( ); // 要素を 1 つずつ取得 System.out.print(i + ' '); // 奇数の要素を削除 if (i % 2 != 0) itr.remove(); } // 次の行のコマンド System.out.println(); // オブジェクト内の要素を出力します System.out.println(al); } }>>

出力
[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

Spliterator は、他の Iterator と同様に、ソースの要素を走査するためのものです。ソースとして使用できるのは、 コレクション 、IO チャネル、またはジェネレーター関数。これは、逐次トラバーサルに加えて効率的な並列トラバーサル (並列プログラミング) をサポートするために JDK 8 に含まれています。 Java Spliterator インターフェイスは、ストリームをより小さな部分に分割する内部反復子です。これらの小さな部品は並行して処理できます。

パンダがデータフレームを作成する

注記: 実際のプログラミングでは、Spliterator を直接使用する必要はないかもしれません。通常の操作では、Java Iterator とまったく同じように動作します。

Java イテレータの利点

  • これは任意の Collection クラスに使用できます。
  • READ 操作と REMOVE 操作の両方をサポートします。
  • コレクション API 用のユニバーサル カーソルです。
  • メソッド名はシンプルで使いやすいです。

Java イテレータの制限

また、イテレータには次のような特定の制限があります。

  • CRUD 操作では、CREATE 操作と UPDATE 操作はサポートされません。
  • 単方向反復子である前方向反復のみをサポートします。
  • Spliterator と比較すると、要素の並列反復はサポートされていません。つまり、順次反復のみがサポートされます。
  • Spliterator と比較すると、大量のデータを反復処理するためのパフォーマンスの向上はサポートされていません。

2. 列挙

従来のコレクション(Vector、Hashtable)の要素を取得するために使用されるインターフェースです。列挙は JDK 1.0 から存在する最初のイテレータであり、残りはより多くの機能を備えた JDK 1.2 に含まれています。列挙は、入力ストリームを指定するためにも使用されます。 シーケンス入力ストリーム 。呼び出して Enumeration オブジェクトを作成できます。 要素() 任意のベクター オブジェクトのベクター クラスのメソッド

構文

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

がある Enumeration インターフェイスのメソッド、つまり次のとおりです。

1. public boolean hasMoreElements(): このメソッドは、この列挙にさらに要素が含まれているかどうかをテストします。

2. パブリックオブジェクト nextElement(): このメソッドは、この列挙の次の要素を返します。それ以上の要素が存在しない場合は NoSuchElementException をスローします

ジャワ
// 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 + ' '); } } }>

出力
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 0 1 2 3 4 5 6 7 8 9>

列挙には次のような特定の制限があります。

  • 列挙は次のものです 遺産 クラス(ベクター、ハッシュテーブル)のみ。したがって、これは普遍的な反復子ではありません。
  • 列挙を使用して削除操作を実行することはできません。
  • 順方向の反復のみが可能です。

Java 列挙型とイテレータの類似点

  • どちらも Java カーソルです。
  • どちらも、オブジェクト要素のコレクションを 1 つずつ反復するために使用されます。
  • どちらも READ または取得操作をサポートします。
  • どちらも単方向 Java カーソルであり、前方方向の反復のみをサポートします。

Java 列挙型とイテレータの違い

次の表では、Java Enumeration と Iterator の違いを説明します。

列挙イテレーター
Java 1.0で導入Java 1.2で導入
レガシーインターフェイスレガシーインターフェイスではない
これは、レガシー コレクション クラスのみを反復するために使用されます。これは任意の Collection クラスに使用できます。
READ 操作のみをサポートします。READ 操作と DELETE 操作の両方をサポートします。
ユニバーサルカーソルではありません。ユニバーサルカーソルです。
長いメソッド名。シンプルで使いやすいメソッド名。

3.リストイテレータ

これは、ArrayList、LinkedList などのリスト コレクション実装クラスにのみ適用できます。双方向の反復を提供します。 ListIterator は、List の要素を列挙する場合に使用する必要があります。このカーソルにはイテレータよりも多くの機能 (メソッド) があります。 ListIterator オブジェクトは呼び出しによって作成できます。 listIterator() List インターフェイスに存在するメソッド。

構文

ListIterator ltr = l.  listIterator  ();>

注記: ここで l は任意の List オブジェクトであり、ltr の型です。 ListIterator インターフェイスであり、l を参照します。 ListIterator インターフェイスは Iterator インターフェイスを拡張します。したがって、Iterator インターフェイスの 3 つのメソッドはすべて ListIterator で使用できます。さらに、 より多くの方法。

1. 順方向

1.1 hasNext(): 反復にさらに多くの要素がある場合は true を返します

public boolean hasNext();>

1.2 next(): Iterator の next() メソッドと同じです。反復内の次の要素を返します。

public Object next();>

1.3 nextIndex(): リスト反復子がリストの最後にある場合は、次の要素のインデックスまたはリストのサイズを返します。

public int nextIndex();>

2. 後進方向

2.1 hasPrevious(): 逆方向にトラバースするときに反復にさらに多くの要素がある場合は true を返します。

public boolean hasPrevious();>

2.2 前(): 反復内の前の要素を返し、スローすることができます NoSuchElementException それ以上の要素が存在しない場合。

public Object previous();>

2.3PreviousIndex(): 前の要素のインデックスを返すか、リスト反復子がリストの先頭にある場合は -1 を返します。

文字列の整数
public int previousIndex();>

3. その他の方法

3.1 削除(): Iteratorのremove()メソッドと同じです。反復内の次の要素を削除します。

public void remove();>

3.2 set(オブジェクトobj): next() またはprevious() によって返された最後の要素を、指定された要素に置き換えます。

tostring メソッド
public void set(Object obj);>

3.3 add(オブジェクトobj): 指定された要素をリスト内の next() によって返される要素の前の位置に挿入します。

public void add(Object obj);>

明らかに、この 3 つの方法は、 リスト反復子 イテレータ ( hasNext() 次() 、 そして 取り除く() ) 両方のインターフェイスでまったく同じことを行います。の hasPrevious() 前の操作は次の操作とまったく同じです。 hasNext() そして 次() 。前者の操作は (暗黙の) カーソルの前の要素を参照するのに対し、後者の操作はカーソルの後の要素を参照します。前の操作ではカーソルが後方に移動し、次の操作ではカーソルが前方に移動します。

ListIterator には現在の要素がありません。そのカーソル位置は常に、への呼び出しによって返される要素の間にあります。 前の() そして、への呼び出しによって返される要素 次()。

1.set() メソッドは 4 つの例外をスローする可能性があります。

  • UnsupportedOperationException: 集合演算がこのリスト反復子でサポートされていない場合
  • クラスキャスト例外: 指定された要素のクラスにより、このリストに要素を追加できない場合
  • IllegalArgumentException: 指定された要素の何らかの側面により、このリストに追加できない場合
  • IllegalStateException: next もpreviousも呼び出されていない場合、またはnextまたはpreviousの最後の呼び出し後にremoveまたはaddが呼び出された場合

2.add() メソッドは 3 つの例外をスローする可能性があります。

  • UnsupportedOperationException: add メソッドがこのリスト反復子でサポートされていない場合
  • クラスキャスト例外: 指定された要素のクラスにより、このリストに要素を追加できない場合
  • IllegalArgumentException: この要素の何らかの側面によりこのリストに追加できない場合

ジャワ
// 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); } }>

出力
[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]>

注記: 同様に、ListIterator にも特定の制限があります。 これは最も強力なイテレータですが、List 実装クラスにのみ適用できるため、汎用イテレータではありません。

注意事項

  1. 最初は、イテレータ参照はコレクション内の最初の要素のインデックスの直前のインデックスを指すことに注意してください。
  2. Enumeration、Iterator、ListIterator はインターフェイスなのでオブジェクトは作成しません。オブジェクトを作成するには、elements()、iterator()、listIterator() などのメソッドを使用します。これらのメソッドには匿名があります。 内部クラス それぞれのインターフェイスを拡張し、このクラス オブジェクトを返します。

注記: $ 参照クラス名のシンボルは、内部クラスの概念が使用され、これらのクラス オブジェクトが作成されたことを証明します。

これは以下のコードで確認できます。内部クラスの詳細については、を参照してください。

ジャワ
// 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()); } }>

出力
java.util.Vector java.util.Vector$Itr java.util.Vector$ListItr>

説明

Java では、イテレータはオブジェクトのコレクションを 1 つずつ移動するために使用されるインターフェイスです。これは、配列、リスト、セット、マップなどのコレクションベースのデータ構造を反復処理するために使用されます。

イテレータには、コレクションを横断するために使用される 3 つの主なメソッドがあります。

  • hasNext() – このメソッドは、コレクション内に反復可能な別の要素があるかどうかを確認します。
  • next() – このメソッドは、コレクション内の次の要素を返します。
  • Remove() – このメソッドは、コレクションから現在の要素を削除します。

Iterator インターフェースは Java Collection Framework の一部であり、さまざまなタイプのコレクションを表すクラスによって実装されます。

プログラム

ジャワ
import java.util.ArrayList; import java.util.Iterator; public class IteratorExample { public static void main(String[] args) { ArrayListnames = 新しい ArrayList(); names.add('アリス'); names.add('ボブ'); names.add('チャーリー'); names.add('デイビッド'); // 名前リストのイテレータを作成する Iteratorイテレータ = names.iterator(); // イテレータを使用して名前リストを反復処理します while (iterator.hasNext()) { String name = iterator.next(); System.out.println(名前); } } }>>'  
出力 この例では、文字列の ArrayList を作成し、それに 4 つの名前を追加しました。次に、ArrayList クラスの iterator() メソッドを使用して、リストのイテレータを作成しました。 hasNext() メソッドを使用してリスト内にさらに反復処理する要素があるかどうかを確認し、 next() メソッドを使用してリスト内の次の要素を取得しました。 System.out.println() メソッドを使用して各要素を出力しました。

イテレータを使用してコレクションを走査すると、コレクションの内部構造を知らなくてもコレクションを反復処理できるため、コレクションを反復処理する便利で効率的な方法になります。また、コレクションを反復処理する際に、コレクションから要素を削除することもできます。

Java におけるイテレータの利点:

  • Iterator は、基礎となる実装を公開せずにコレクションを走査できるようにする、シンプルで使いやすいインターフェイスです。
  • Iterator は、特に大量のデータがある場合に、コレクションを反復処理する効率的な方法です。
  • Iterator は、同時変更例外を発生させることなく、反復中にコレクションから要素を削除する安全な方法を提供します。
  • Iterator インターフェイスは Java のすべてのコレクション クラスによって実装されるため、同じコードを使用してさまざまな種類のコレクションを反復処理できます。

Java におけるイテレータの欠点:

Java で Iterator を使用すると、以下に示すようないくつかの欠点があります。

  • Iterator は単方向インターフェイスです。つまり、コレクション内を前方にのみ進むことができます。前に戻ったり、特定の要素にジャンプしたりすることはできません。
  • Iterator はスレッドセーフではないため、適切な同期がなければ、マルチスレッド環境でコレクションを反復処理するために Iterator を使用することはできません。
  • Iterator は、要素の削除以外に、コレクションの反復中に要素を変更するメカニズムを提供しません。要素を変更する必要がある場合は、ListIterator や単純な for ループなどの他のインターフェイスを使用する必要があります。