Javaには四つのカーソルがあることを知っています: Enumeration、Iterator、ListIterator、およびSpliterator。前回の投稿でEnumerationとIteratorのカーソルについてすでに議論しました。この投稿を進める前に、前回の投稿を参照してください: Java Iterator。この投稿では、三番目のJavaカーソルについて議論します: ListIterator。
Java ListIterator
Iteratorと同様に、ListIteratorはListを実装したオブジェクトから要素を1つずつ反復処理するためのJava Iteratorです。
- これはJava 1.2以降で利用可能です。
- Iteratorインターフェースを拡張しています。
- Listを実装したクラスにのみ有用です。
- Iteratorとは異なり、CRUD(CREATE、READ、UPDATE、DELETE)のすべての操作をサポートしています。
- Iteratorとは異なり、前方向と後方向の反復をサポートしています。
- これは双方向のIteratorです。
- 現在の要素はなく、そのカーソル位置は常にprevious()の呼び出しで返される要素とnext()の呼び出しで返される要素の間にあります。
注意: Collection APIのCRUD操作とは何ですか?
- CREATE: Collectionオブジェクトに新しい要素を追加します。
- READ: Collectionオブジェクトから要素を取得します。
- 更新: コレクションオブジェクト内の既存の要素の更新または設定。
- 削除: コレクションオブジェクトから要素を削除します。
Java ListIterator クラス ダイアグラム
Javaでは、ListIteratorはCollection API内のインターフェースです。 Iteratorインターフェースを拡張しています。 前方および後方方向の反復およびCRUD操作をサポートするため、次のメソッドがあります。 これをArrayList、CopyOnWriteArrayList、LinkedList、Stack、VectorなどのすべてのList実装クラスで使用できます。 これらのメソッドを詳細に調査し、いくつかの便利なメソッドを後続のセクションで探索します。
Java ListIterator メソッド
Java ListIteratorインターフェースには、次のメソッドがあります。
- void add(E e): 指定された要素をリストに挿入します。
- boolean hasNext(): リストを前方向に走査する際にこのリストイテレータにさらに要素がある場合はtrueを返します。
- boolean hasPrevious(): リストを逆方向に走査する際にこのリストイテレータにさらに要素がある場合はtrueを返します。
- E next(): Returns the next element in the list and advances the cursor position.
- int nextIndex(): 次の呼び出しで返される要素のインデックスを返します。
- E previous(): Returns the previous element in the list and moves the cursor position backwards.
- int previousIndex(): 前の呼び出しで返される要素のインデックスを返します。
- void remove(): 次の()または前の()によって返された最後の要素をリストから削除します。
- void set(E e): 次の()または前の()によって返された最後の要素を指定された要素で置き換えます。
これらのメソッドを使い、有用な例を使って一つ一つ探求していきます。
Java ListIterator 基本例
このセクションでは、いくつかのListIteratorメソッドとその例について説明します。まず、このイテレータオブジェクトを取得する方法を理解する必要があります。ListIteratorを取得する方法
ListIterator<E> listIterator()
これは、このリスト内の要素に対するリストイテレータを返します。例:
import java.util.*;
public class ListIteratorDemo
{
public static void main(String[] args)
{
List();
names.add("Rams");
names.add("Posa");
names.add("Chinni");
// ListIteratorを取得する
ListIterator<String> namesIterator = names.listIterator();
// 要素をトラバースする
while(namesIterator.hasNext()){
System.out.println(namesIterator.next());
}
// 拡張forループはここで内部イテレータを作成します。
for(String name: names){
System.out.println(name);
}
}
}
出力:
Rams
Posa
Chinni
ListIterator 双方向イテレーションの例
セクションでは、ListIteratorのメソッドが前方および後方のイテレーションを実行する方法を調べます。
import java.util.*;
public class BiDirectinalListIteratorDemo
{
public static void main(String[] args)
{
List();
names.add("Rams");
names.add("Posa");
names.add("Chinni");
// ListIteratorの取得
ListIterator<String> listIterator = names.listIterator();
// 要素の走査
System.out.println("Forward Direction Iteration:");
while(listIterator.hasNext()){
System.out.println(listIterator.next());
}
// 要素の走査, the iterator is at the end at this point
System.out.println("Backward Direction Iteration:");
while(listIterator.hasPrevious()){
System.out.println(listIterator.previous());
}
}
}
出力:-
Forward Direction Iteration:
Rams
Posa
Chinni
Backward Direction Iteration:
Chinni
Posa
Rams
Javaイテレーターの種類
Javaには4つのカーソルがあります:Enumeration、Iterator、ListIterator、およびSpliterator。以下に示すように、これらを2つの主要なタイプに分類することができます。
- 単方向イテレーター
これらは前方向のイテレーションのみをサポートするカーソルです。例えば、Enumeration、Iteratorなどがあります。- 双方向イテレーター
これらは前方向および後方向のイテレーションの両方をサポートするカーソルです。ListIteratorなどがあります。
Java ListIteratorの内部動作はどのようになっていますか?
Java ListIteratorは前方向および後方向の両方向で動作することがわかっています。これは双方向イテレーターです。この機能をサポートするために、2つのセットのメソッドがあります。
- Forward Direction Iteration methods
以下のメソッドを使用して、前方向の反復をサポートする必要があります:
- hasNext())
- next()
- nextIndex()
- Backward Direction Iteration methods
以下のメソッドを使用して、後方向の反復をサポートする必要があります:
- hasPrevious()
- previous()
- previousIndex()
以前の投稿では、イテレータが前方向で内部的にどのように動作するかについてすでに説明しました。「Javaイテレータが内部でどのように機能するか?」セクション。ListIteratorも同じように機能します。以前の投稿をご覧になりたい場合は、こちらをクリックしてください:Javaイテレータ。このセクションでは、ListIteratorが後方向でどのように機能するかについて説明します。この機能を理解するために、次のLinkedListオブジェクトを使用しましょう。
List<String> names = new LinkedList<>();
names.add("E-1");
names.add("E-2");
names.add("E-3");
.
.
.
names.add("E-n");
次に、次のようにLinkedList上でListIteratorオブジェクトを作成します:
ListIterator<String> namesIterator = names.listLterator();
「namesIterator」というListIteratorが次のように見えると仮定しましょう: ここで、ListIteratorのカーソルはリストの最初の要素の前を指しています。次に、次のコードスニペットをwhileループで実行します。
namesIterator.hasNext();
namesIterator.next();
上記のコードスニペットをwhileループで実行すると、ListIteratorのカーソルがLinkedListの最後の要素を指します。 次に、次のコードスニペットを実行して、終わりから開始までトラバースを開始できます。
namesIterator.hasPrevious();
namesIterator.previous();
上記のコードスニペットを実行すると、ListIteratorのカーソルがリスト内の「最後から2番目」の要素を指します。LinkedListのListIteratorのカーソルを最初の要素に移動させるには、このプロセスを行います。
最初の要素を読み取った後、以下のコードスニペットを実行すると、「false」値が返されます。
namesIterator.hasPrevious();
ListIteratorのカーソルがLinkedListの最初の要素の前を指しているため、hasPrevious()メソッドはfalse値を返します。これらの図をすべて観察した後、JavaのListIteratorは以下の図に示すように、前方方向と後方方向の反復をサポートしていることがわかります。そのため、双方向カーソルとしても知られています。前方向のListIterator
後方方向のListIterator
ListIteratorの利点
Iteratorとは異なり、ListIteratorには次の利点があります:
- Iteratorと同様に、読み取りと削除操作をサポートします。
- 作成および更新操作もサポートしています。
- それは、CRUD操作をサポートしています:CREATE、READ、UPDATE、DELETE操作。
- それは、前方および後方向の反復をサポートしています。これは、双方向のJavaカーソルです。
- メソッド名はシンプルで使いやすいです。
ListIteratorの制限
Iteratorと比較して、Java ListIteratorには多くの利点がありますが、以下に一部の制限があります。
- これは、Iterator専用のList実装クラスです。
- Iteratorとは異なり、全体のCollection APIには適用されません。
- これは、汎用のJavaカーソルではありません。
- Spliteratorと比較して、要素の並列反復をサポートしていません。
- Spliteratorと比較して、大量のデータを反復するための優れたパフォーマンスをサポートしていません。
IteratorとListIteratorの類似点
このセクションでは、Javaの2つのカーソル、IteratorとListIteratorの類似点について説明します。
- 両方はJava 1.2で導入されました。
- 両方とも、コレクションまたはリストの要素を反復処理するためのイテレータです。
- 両方ともREADおよびDELETE操作をサポートしています。
- 両方ともForward Directionイテレーションをサポートしています。
- 両方ともレガシーインターフェイスではありません。
IteratorとListIteratorの違い
このセクションでは、Javaの2つのイテレーターであるIteratorとListIteratorの違いについて説明します。
Iterator | ListIterator |
---|---|
Introduced in Java 1.2. | Introduced in Java 1.2. |
It is an Iterator for whole Collection API. | It is an Iterator for only List implemented classes. |
It is an Universal Iterator. | It is NOT an Universal Iterator. |
It supports only Forward Direction Iteration. | It supports both Forward and Backward Direction iterations. |
It’s a Uni-Directional Iterator. | It’s a Bi-Directional Iterator. |
It supports only READ and DELETE operations. | It supports all CRUD operations. |
We can get Iterator by using iterator() method. | We can ListIterator object using listIterator() method. |
これで、JavaのListIteratorに関するすべてです。これらのJavaのListIteratorの理論と例がListIteratorプログラミングの始め方に役立つことを願っています。参考:ListIterator APIドキュメント
Source:
https://www.digitalocean.com/community/tutorials/java-listiterator