for文

目次
  • 解説
  • 1. for文
問題に挑戦!
進捗を変更する




解説

1. for文


ループはその性質から、配列とセットで使用されることが非常に多いのですが、前のページで学習した通り、while文の場合は次のような書き方が必要となります。

  • while文の前で、Index変数の宣言と代入を行う
  • ブロックの中で、Index変数を変化させる
  • 条件式で、Index変数と要素数を比較する

この場合、添字管理用のコードが分散してしまうことや、書き忘れによる無限ループに繋がりやすいことなど、少し不便です。

    static void practiceWhile() {
        int[] sellCounter = new int[] { 10, 20, 30 };

        int counterIndex = 0;                       // 添字管理の為のコード
        while (counterIndex < sellCounter.length) {
            Logger.out(sellCounter[counterIndex]);  // 本当に行いたい処理
            counterIndex++;                         // 添字管理の為のコード
        }
    }

そこでfor文の登場です。for文はこれらの添字管理用のコードが1行に凝縮されています。

    static void practiceFor() {
        int[] sellCounter = new int[] { 10, 20, 30 };

        for (int idx = 0; idx < sellCounter.length; idx++) {
            Logger.out(sellCounter[idx]);
        }
    }

キーワード「for」に続く丸括弧の中はセミコロン「;」で3つに区切られています。仮に

for ( A; B; C ) { ~ }

とした場合、

  • Aで、Index変数の宣言と代入を行う
  • Bで、Index変数と要素数を比較する(=条件式)
  • Cで、Index変数を変化させる

のようになっています。言い換えると、

  • Aは、for文のいちばん最初に1回のみ実行される
  • Bは、ブロックを実行する前に毎回評価される
  • Cで、ブロックを実行した後に毎回実行される

という構造となっており、配列の添字などのように、連続して変化する値を使用するループ処理を行うことに最適です。このような場合にはwhile文よりfor文を使用するようにしましょう。

なお、for文ではIndex変数スコープが、ブロック内に限定されるということも大きなメリットです。Index変数の変数名は、添字としての用途が明確となることや、for文の行が長くなり過ぎることを防ぐ目的から、「idx」や「i」のような短縮形を用いることが一般的です。

問題

確認問題


確認問題1

次のコードの中で、for文の使い方が正しく、
変数aの値が最終的に8となる構文はどれか。

実践問題


(1)VSCodeを起動し、ヘッダーメニューの「ファイル」>「フォルダーを開く...」から、「workspace_java_basic」プロジェクトを開いてください。
(2)workspace_java_basic」プロジェクトの「net.digskill
パッケージの「ArrayAndLoop.java」を開いてください。
※無い場合は「配列」を先に学習しましょう。
(3)ArrayAndLoop」クラス内に次のサンプルコードのメソッドをコピー&ペーストし、
mainから呼び出せるようにして、「F5」で実行できることを確認してください。
(4)コメント行に記された各問題文に対し、答えとなるプログラムコードを
問題文の次の空白行以降に書き込みまたは書き換えて
、「F5」で実行してください。
    static void questionFor() {
        // (問1)空白行にString型の配列変数arrayQ1を作成し、
        // 「あ」「い」「う」「え」「お」の5つの要素を代入してください。
        // 続けてfor文によるループ処理を作成し、
        // 変数displayQ1にすべて結合させてください。
        String displayQ1 = "";

        Logger.out(displayQ1);

        // (問2)空白行にfor文によるループ処理を作成し、
        // arrayQ1から「あ」「う」「お」のみを
        // 変数displayQ2に結合させてください。
        // ただし、arrayQ1はそのまま使用し、加工や複製をしてはいけません。
        String displayQ2 = "";

        Logger.out(displayQ2);

        // (問3)空白行にfor文によるループ処理を作成し、
        // 変数displayQ3にarrayQ1の中身を逆順ですべて結合させてください。
        // ただし、arrayQ1はそのまま使用し、加工や複製をしてはいけません。
        String displayQ3 = "";

        Logger.out(displayQ3);

        // (問4)空白行にfor文によるループ処理を作成し、
        // 変数displayQ4にarrayQ1の中身の内、
        // 「え」のみを除いて逆順で結合させてください。
        // ただし、arrayQ1はそのまま使用し、加工や複製をしてはいけません。
        String displayQ4 = "";

        Logger.out(displayQ4);
    }
実行結果例を表示
[2020/12/31 12:34:56.789] あいうえお
[2020/12/31 12:34:56.789] あうお
[2020/12/31 12:34:56.789] おえういあ
[2020/12/31 12:34:56.789] おういあ

正解


(問1)正解を表示
String[] arrayQ1 = new String[] { "あ", "い", "う", "え", "お" };
for (int idx = 0; idx < arrayQ1.length; idx++) {
    displayQ1 += arrayQ1[idx];
}

(問2)正解を表示
for (int idx = 0; idx < arrayQ1.length; idx += 2) {
    displayQ2 += arrayQ1[idx];
}

(問3)正解を表示
for (int idx = arrayQ1.length - 1; idx >= 0; idx--) {
    displayQ3 += arrayQ1[idx];
}

(問4)正解を表示
for (int idx = arrayQ1.length - 1; idx >= 0; idx--) {
    if (!arrayQ1[idx].equals("え")) {
        displayQ4 += arrayQ1[idx];
    }
}

正解プログラムコード全文を表示
    static void questionFor() {
        // (問1)空白行にString型の配列変数arrayQ1を作成し、
        // 「あ」「い」「う」「え」「お」の5つの要素を代入してください。
        // 続けてfor文によるループ処理を作成し、
        // 変数displayQ1にすべて結合させてください。
        String displayQ1 = "";
        String[] arrayQ1 = new String[] { "あ", "い", "う", "え", "お" };
        for (int idx = 0; idx < arrayQ1.length; idx++) {
            displayQ1 += arrayQ1[idx];
        }
        Logger.out(displayQ1);

        // (問2)空白行にfor文によるループ処理を作成し、
        // arrayQ1から「あ」「う」「お」のみを
        // 変数displayQ2に結合させてください。
        // ただし、arrayQ1はそのまま使用し、加工や複製をしてはいけません。
        String displayQ2 = "";
        for (int idx = 0; idx < arrayQ1.length; idx += 2) {
            displayQ2 += arrayQ1[idx];
        }
        Logger.out(displayQ2);

        // (問3)空白行にfor文によるループ処理を作成し、
        // 変数displayQ3にarrayQ1の中身を逆順ですべて結合させてください。
        // ただし、arrayQ1はそのまま使用し、加工や複製をしてはいけません。
        String displayQ3 = "";
        for (int idx = arrayQ1.length - 1; idx >= 0; idx--) {
            displayQ3 += arrayQ1[idx];
        }
        Logger.out(displayQ3);

        // (問4)空白行にfor文によるループ処理を作成し、
        // 変数displayQ4にarrayQ1の中身の内、
        // 「え」のみを除いて逆順で結合させてください。
        // ただし、arrayQ1はそのまま使用し、加工や複製をしてはいけません。
        String displayQ4 = "";
        for (int idx = arrayQ1.length - 1; idx >= 0; idx--) {
            if (!arrayQ1[idx].equals("え")) {
                displayQ4 += arrayQ1[idx];
            }
        }
        Logger.out(displayQ4);
    }