Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaでLinkedListを反復処理する3つの方法を徹底解説

LinkedList(連結リスト)は、ポインタによって順番につながれたノードの集まりで構成されるデータ構造です。LinkedListは動的配列のように振る舞うことができ、各要素に対して「ノード」と呼ばれる独立したメモリブロックを個別に割り当てます。各ノードは2つのフィールドを持っており、1つはリストが保持する要素を格納する「data」フィールド、もう1つは前のノードと次のノードをつなぐためのポインタである「next」フィールドです。

Javaでは、LinkedListの要素を主に3つの方法で反復処理(イテレート)することができます。それぞれの特徴と使い方を、サンプルコードと実行結果とともに見ていきましょう。

方法1:Iteratorを使う

Iteratorクラスを使用すると、LinkedListの要素を先頭から順に反復処理できます。反復中に要素を安全に削除したい場合にも適した、最も基本的な方法です。

コード例

import java.util.*;
public class LinkedListIteratorTest {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        list.add("Kohli");
        list.add("Morgan");
        list.add("Williamson");
        list.add("Smith");
        list.add("Kohli");

        Iterator it = list.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

実行結果

Kohli
Morgan
Williamson
Smith
Kohli

hasNext()で次の要素が存在するかを確認し、next()で実際の要素を取得します。この2つのメソッドを組み合わせることで、コレクション全体を安全に走査できます。

方法2:ListIteratorを使う

ListIteratorクラスは、Iteratorを拡張したインターフェースで、双方向の走査が可能な点が大きな特徴です。hasNext()/next()による前方への走査に加え、hasPrevious()/previous()による後方への走査もサポートしています。

コード例

import java.util.*;
public class LinkedListWithListIteratorTest {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        list.add("Kohli");
        list.add("Morgan");
        list.add("Williamson");
        list.add("Smith");
        list.add("Kohli");

        ListIterator<String> li = list.listIterator();
        while(li.hasNext()) {
            System.out.println(li.next());
        }
    }
}

実行結果

Kohli
Morgan
Williamson
Smith
Kohli

ListIteratorは、走査中の要素の置き換え(set())や追加(add())など、Iteratorよりも豊富な操作が可能です。

方法3:拡張forループ(for-each)を使う

拡張forループ(for-each文)を使えば、より簡潔で読みやすいコードでLinkedListを反復処理できます。単純に全要素を読み取りたい場合には、この方法が最もおすすめです。

コード例

import java.util.*;
public class LinkedListForEachTest {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        list.add("Kohli");
        list.add("Morgan");
        list.add("Williamson");
        list.add("Smith");
        list.add("Kohli");

        for(String str : list) {
            System.out.println(str);
        }
    }
}

実行結果

Kohli
Morgan
Williamson
Smith
Kohli

まとめ:どの方法を選ぶべきか?

  • Iterator:標準的な前方走査に加え、反復中の要素削除(remove())が必要な場合に最適。
  • ListIterator:前後双方向の走査や、走査中の要素の更新・追加が必要な場合に有効。
  • 拡張forループ:単純に全要素を参照するだけなら、最も簡潔で可読性の高い選択肢。

用途に応じてこれら3つの方法を使い分けることで、LinkedListを効率的かつ安全に扱うことができます。

  1. JavaのJRadioButtonMenuItemとは?メニュー項目の作成方法とサンプルコードを解説

    JRadioButtonMenuItemは、Java SwingのJMenuItemクラスを継承したサブクラスです。同じグループに属する複数のメニュー項目の中から1つだけを選択できるラジオボタン形式のメニュー項目で、選択された項目にはその選択状態が表示されます。 複数のJRadioButtonMenuItemをButtonGroupオブジェクトに追加することでボタングループを形成できます。グループ内のいずれかの項目が選択されると、その他のすべてのラジオボタンメニュー項目は自動的に選択解除されます。この仕組みにより、設定画面などで「排他的な選択」を簡単に実現できます。 構文 public cla

  2. JavaのJListで使える選択モードは何種類?3つのモードの違いを解説

    JListは、JComponentクラスを継承したSwingコンポーネントの一つで、オブジェクトのリストを画面に表示し、ユーザーがその中から1つ以上の項目を選択できるようにするためのものです。 JavaのJListには、用途に応じて使い分けられる3種類の選択モードが用意されています。 ListSelectionModel.SINGLE_SELECTION:一度に選択できるのは、リスト内の1つのインデックスだけです。 ListSelectionModel.SINGLE_INTERVAL_SELECTION:一度に選択できるのは、1つの連続した区間(連続するインデックスの範囲)だけです。 Lis