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を効率的かつ安全に扱うことができます。
-
JavaのJRadioButtonMenuItemとは?メニュー項目の作成方法とサンプルコードを解説
JRadioButtonMenuItemは、Java SwingのJMenuItemクラスを継承したサブクラスです。同じグループに属する複数のメニュー項目の中から1つだけを選択できるラジオボタン形式のメニュー項目で、選択された項目にはその選択状態が表示されます。 複数のJRadioButtonMenuItemをButtonGroupオブジェクトに追加することでボタングループを形成できます。グループ内のいずれかの項目が選択されると、その他のすべてのラジオボタンメニュー項目は自動的に選択解除されます。この仕組みにより、設定画面などで「排他的な選択」を簡単に実現できます。 構文 public cla
-
JavaのJListで使える選択モードは何種類?3つのモードの違いを解説
JListは、JComponentクラスを継承したSwingコンポーネントの一つで、オブジェクトのリストを画面に表示し、ユーザーがその中から1つ以上の項目を選択できるようにするためのものです。 JavaのJListには、用途に応じて使い分けられる3種類の選択モードが用意されています。 ListSelectionModel.SINGLE_SELECTION:一度に選択できるのは、リスト内の1つのインデックスだけです。 ListSelectionModel.SINGLE_INTERVAL_SELECTION:一度に選択できるのは、1つの連続した区間(連続するインデックスの範囲)だけです。 Lis