コンテンツにスキップ

Java/基礎/反復処理

出典: フリー教科書『ウィキブックス(Wikibooks)』

反復処理 (Iteration)

[編集]

反復処理とは、同じ一連の操作を繰り返すことによって、コードを簡潔にし、再利用性を向上させるプログラミング技術です。Javaでは、次のような方法で反復処理を実現できます。

以下では、それぞれの手法について詳しく説明し、適用場面や使用例を示します。

for文

[編集]

for文は、反復処理を行うための制御構造で、次の形式で使用されます。

for (初期化式; 継続条件式; 更新式) {
    // 繰り返し実行されるコード
}
各構成要素
初期化式
反復処理が始まる前に一度だけ実行されます。通常、反復変数を初期化します。
継続条件式
反復を続ける条件を定義します。trueの場合にループを継続し、falseになると終了します。
更新式
各反復の後に評価され、反復変数の更新などに使用されます。
以下は、0から9までの整数を出力するコード例です。
for (int i = 0; i < 10; i++) {
    System.out.println(i);
}

while文

[編集]

while文は、指定された条件がtrueである間、コードを繰り返し実行します。

while (条件式) {
    // 繰り返し実行されるコード
}
次のコードは、0から9までの整数を出力します。
int i = 0;
while (i < 9) {
    System.out.println(i);
    i++;
}

do-while文

[編集]

do-while文は、少なくとも一度はコードを実行し、その後条件を評価して反復を続けるかどうかを決定します。

do {
    // 最低1回実行されるコード
} while (条件式);
以下は、do-while文を使って0から9までの整数を出力する例です。
int i = 0;
do {
    System.out.println(i);
    i++;
} while (i < 10);

フロー制御構文

[編集]

フロー制御構文 (Flow Control Structures)は、プログラムの実行順序を制御するための重要な構造です。Javaでは、反復処理を途中で制御するためのフロー制御構文として、breakcontinueを使用できます。これらを利用すると、ループ内で処理の流れを柔軟に変更することができます。

break文

[編集]

break文は、現在のループを即座に終了させるために使用します。主にfor文、while文、do-while文それに拡張for文で使われます。

以下は、for文内でbreakを使用して、10までの数字を出力し、途中で5を見つけた時点でループを終了する例です。

for (int i = 0; i < 10; i++) {
    if (i == 5) {
        break; // 5が出力される前にループを終了
    }
    System.out.println(i);
}
このコードでは、iが5のときにbreakが実行され、ループは終了します。結果として、0から4までの数値が出力されます。

continue文

[編集]

continue文は、現在の反復処理をスキップして、次の反復に進むために使用します。ループ内で特定の条件を満たす場合に処理を飛ばすことができます。

以下のコードでは、for文内でcontinueを使用して、偶数だけを出力する例です。

for (int i = 0; i < 10; i++) {
    if (i % 2 != 0) {
        continue; // 偶数以外は次の反復に進む
    }
    System.out.println(i);
}
このコードでは、iが偶数の場合のみ出力され、奇数のときはcontinueにより次の反復に進みます。結果として、0, 2, 4, 6, 8が出力されます。
breakとcontinueの使用場面
  • break: ループを途中で終了したい場合に使用します。例えば、探索アルゴリズムで目標の要素を見つけた時に検索を終了したい場合に便利です。
  • continue: 条件に基づいて反復処理をスキップしたい場合に使用します。例えば、特定の条件に一致しない要素を無視する場合に役立ちます。

これらのフロー制御構文を使うことで、プログラムの制御がより柔軟になり、効率的なコードの記述が可能となります。

Iterator

[編集]

Iteratorは、Javaのコレクションフレームワークで提供されるインターフェースで、コレクション内の要素に順番にアクセスするための仕組みを提供します。これを使用することで、コレクションの内部構造を意識せずに要素を反復処理することができます。

Iteratorの基本的な使い方

[編集]

Iteratorを使用するには、まずコレクションからiterator()メソッドを呼び出してIteratorオブジェクトを取得します。その後、hasNext()メソッドとnext()メソッドを組み合わせて反復処理を行います。

以下は、ArrayListを例にしたIteratorの基本的な使用方法です。

import java.util.ArrayList;
import java.util.Iterator;

class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}
このコードでは、ArrayListに格納された文字列をIteratorを使用して順番に出力しています。
  • hasNext()メソッドは、次の要素が存在する場合にtrueを返します。
  • next()メソッドは、次の要素を返し、Iteratorを次に進めます。

Iteratorでの要素削除

[編集]

Iteratorを使用すると、コレクション内の要素を安全に削除することができます。削除にはremove()メソッドを使用します。

以下は、特定の要素をIteratorで削除する例です。

import java.util.ArrayList;
import java.util.Iterator;

class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            if ("Banana".equals(iterator.next())) {
                iterator.remove();
            }
        }

        System.out.println(list); // 出力: [Apple, Cherry]
    }
}
このコードでは、コレクションから"Banana"を削除しています。
注意点として、Iteratorを使用しないでコレクションを直接操作すると、ConcurrentModificationExceptionが発生する場合があります。

Iteratorを使用する場面

[編集]
Iteratorは次のような場面で使用されます。
  • コレクションの内部構造に依存せずに要素を操作したい場合。
  • 要素を反復処理しながら安全に削除を行いたい場合。
  • コレクションフレームワークが提供する統一的なAPIを利用したい場合。

Iteratorはシンプルで強力なツールですが、最近ではfor-each構文やStreamAPIがよく使用されるため、使用頻度はやや減少しています。ただし、特殊な操作が必要な場合には今でも有用です。

forEachメソッド

[編集]

Java 8以降では、コレクションや配列を簡潔に反復処理するforEachメソッドが利用可能です。

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        Arrays.asList("A", "B", "C").forEach(item -> {
            System.out.println(item);
        });
    }
}

拡張for文(for-each構文)

[編集]

拡張for文(for-each構文)は、Iteratorを内部的に使用して、コレクションや配列の要素を簡潔に反復処理できる構文です。

以下は、拡張for文を使用した例です。

import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        for (var item : list) {
            System.out.println(item);
        }
    }
}
このコードでは、ArrayListの各要素を簡潔に出力しています。

利点と制限

[編集]
拡張for文の利点:
  • コードが簡潔で読みやすい。
  • Iteratorの操作を手動で行う必要がない。
制限:
  • コレクション内の要素を削除する操作はできない。
  • Iteratorを直接操作したい場合には適さない。

拡張for文は、コレクションの要素を単純に反復処理する場合に最適です。一方、要素を削除する必要がある場合は、Iteratorを使用する必要があります。

比較演算子

[編集]

反復処理の条件を指定する際に、比較演算子を使用します。以下は主な比較演算子の一覧です。

比較演算子一覧
演算子 意味
== 等しい場合にtrueを返す
!= 等しくない場合にtrueを返す
< 小さい場合にtrueを返す
> 大きい場合にtrueを返す
<= 小さいか等しい場合にtrueを返す
>= 大きいか等しい場合にtrueを返す
instanceof オブジェクトが指定された型である場合にtrueを返す

注意点

[編集]
  • == はプリミティブ型の値やオブジェクト参照を比較します。オブジェクトの内容を比較する場合は、equals() メソッドを使用してください。
  • forEachメソッドは簡潔ですが、例外処理が必要な場合や特定の順序を保証する必要がある場合は適していないことがあります。

この章では、Javaで使用される反復処理の主な構文とその使い方を解説しました。次のステップとして、各手法の適用場面を実際にコードを書きながら試してみましょう。