HOWTO · Java

Java でリンクリストを反復処理する

この記事では、Java でリンクリストを反復処理する方法を紹介します

リンクリストは、データ要素の線形で順序付けられたコレクションです。要素の配置は、メモリ内の至る所にある、またはランダムな場所にあります。リンクリストのデータ構造は、ノードを使用して接続されます。ノードは、シーケンス内の次の要素のメモリ位置であるデータフィールドと参照リンクを保持します。

リンクリスト要素は連続していないメモリ位置に格納され、最後のノードには null 参照へのポインタが含まれています。

リンクリストを反復処理する方法はたくさんあります。以下に説明するいくつかの方法があります。

Java で for ループを使用してリンクリストを反復処理する

LinkedList クラスは、以下のコード例の new キーワードを使用してインスタンス化されます。LinkedList クラスの add() メソッドは、リストに要素を追加します。add メソッドは、指定された要素をこのリストの最後に追加します。このメソッドは、addLast メソッドと同等です。要素がリストに正常に追加されると、メソッドは true を返します。

リストの作成後、for ループを使用してリストを反復処理します。以下のコードでは、int i=0 はカウンター変数のインスタンス化です。変数がリストのサイズよりも小さい必要があることを示す条件を使用します。また、リストのサイズは、size() メソッドを使用して計算されます。最後に、変数の値が 1 ずつ増加します。この完全なプロセスは、変数値がリストのサイズを超えるまで実行されます。

package linkedList;

import java.util.LinkedList;

public class IterateLinkedListUsingForLoop {
  public static void main(String[] args) {
    LinkedList<String> list = new LinkedList<>();
    list.add("First");
    list.add("Second");
    System.out.println("Iterating the list using for-loop");
    for (int i = 0; i < list.size(); i++) {
      System.out.println(list.get(i));
    }
  }
}

上記のプログラムは、以下のように出力を生成します。

Iterating the list using for-loop
First
Second

Java で拡張された for ループを使用してリンクリストを反復処理する

拡張された for ループは for-each ループとも呼ばれ、for ループの一種です。

以下のコードでは、リンクリストオブジェクトをインスタンス化する必要があります。次に、いくつかの要素(たとえば、String オブジェクト)を追加する必要があります。ここで繰り返しますが、この場合は for-each を使用します。

package linkedList;

import java.util.LinkedList;

public class IteratingLinkedListUsingForEach {
  public static void main(String[] args) {
    LinkedList<String> list = new LinkedList<>();
    list.add("First");
    list.add("Second");
    for (String temp : list) {
      System.out.println(temp);
    }
  }
}

プログラムの出力は、最初のプログラムの出力と同じです。

while ループを使用してリンクリストを反復処理する

インスタンス化とリストプロセスへの要素の追加は、前述のすべての点で類似しています。

以下の例では、カウンター変数値は while ループの外側で 0 にインスタンス化されます。while ループ構文には、インスタンス化の場所がありません。次に、条件を適用します。これは、変数が指定されたリストのサイズよりも小さいかどうかをチェックします。true を返し、println() 関数が実行されます。その後、カウンター変数をインクリメントする必要があります。このプロセスは、変数がリストサイズより大きくなるまで繰り返されます。

package linkedList;

public class IteratingLinkedListUsingWhileLoop {
  public static void main(String[] args) {
    LinkedList<String> list = new LinkedList<>();
    list.add("First");
    list.add("Second");
    int i = 0;
    while (i < list.size()) {
      System.out.println(list.get(i));
      i++;
    }
  }
}

Java の Iterator クラスを使用してリンクリストを反復する

イテレータは、コレクションオブジェクトのループで動作するクラスです。これらは、ArrayArrayListLinkedList などです。コレクションオブジェクトをループするため、これをイテレータと呼びます。Iterator クラスのメソッドを使用して、Collections オブジェクトを反復処理する必要があります。

iterator() メソッドを使用して、任意のコレクションの Iterator を取得します。hasNext メソッドは、リストに more-要素があるかどうかをチェックします。反復にさらに要素が存在する場合は、true を返します。

next メソッドは、ループ内の次の要素を取得します。反復で次に存在するオブジェクトを返し、リストに要素が存在しない場合は NoSuchElementException をスローします。

以下のコードは、Iterator クラスとそのメソッドを示しています。

package linkedList;

public class IteratingLinkedListUsingIterator {
  public static void main(String[] args) {
    LinkedList<String> list = new LinkedList<>();
    list.add("First");
    list.add("Second");
    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
      System.out.println(iterator.next());
    }
  }
}

Java 8 Streams を使用してリンクリストを反復する

stream は常にコレクションオブジェクト上に形成されます。以下のプログラムでは、同じために stream メソッドを使用します。関数は、ストリーム関数のチェーン全体に適用されます。forEachターミナル操作です。これは、端末機能の後で操作を実行できないことを意味します。それは消費者ストリームを取り、このストリームは要素を放出せず、むしろそれらを消費します。

以下のコードは、Java 8 ストリームの使用と、リストを反復処理するためのそれらの関数を示しています。

package linkedList;

public class IteratingLinkedListUsingStreams {
  public static void main(String[] args) {
    LinkedList<String> list = new LinkedList<>();
    list.add("First");
    list.add("Second");
    list.stream().forEach((element) -> { System.out.println(element); });
  }
}