読み込み中...

Javaでマスターするたった8つのwhile文テクニック

Javaのwhile文徹底解説 Java
この記事は約20分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

あなたがプログラミングの世界に足を踏み入れたばかりで、ループ処理という言葉にピンとこないなら、この記事はまさにあなたのために書かれました。

Javaでのwhile文の使い方をマスターすることで、効率的なプログラミングが可能になります。

この記事を最後まで読むことで、while文の基本から応用、さらにはカスタマイズ方法まで、詳しく学ぶことができます。

●Javaとは

Javaは、多くのプラットフォームで動作するプログラミング言語の一つです。

スマホアプリから企業システムまで幅広い用途で利用されています。

○基本構文

Javaの基本構文は他のC系言語と似ています。

クラスとメソッドを定義し、その中で処理を記述します。

// クラスの定義
public class HelloWorld {
  // メインメソッド
  public static void main(String[] args) {
    // 処理内容
    System.out.println("Hello, world!");
  }
}

このコードは最も基本的なJavaのプログラムです。

public class HelloWorldHelloWorldという名前のクラスを作成しています。

public static void main(String[] args)はJavaプログラムのエントリーポイント(起動時に最初に実行されるメソッド)です。

その中でSystem.out.println("Hello, world!");が実行され、結果として「Hello, world!」と出力されます。

○インストール方法

Javaを使い始める前に、まずは開発環境を整える必要があります。多くのOSで利用できるOracle JDKや、オープンソースのOpenJDKがあります。

Oracle JDKをWindowsにインストールする手順を紹介します。

  1. Oracleのウェブサイトから最新のJDK(Java Development Kit)をダウンロード。
  2. ダウンロードしたインストーラを実行。
  3. インストールオプションを選択し、「Next」をクリック。
  4. インストールが完了したら、環境変数を設定。

●while文の基本

Javaでよく使われるループ処理にwhile文があります。

ここでは、while文がどのような構造で、どのような機能を持つのかを詳しく解説します。

○構造と機能

while文は基本的に次のような形で書きます。

while (条件式) {
  // ループ内で実行する処理
}

この構造で、条件式trueである限り、ループ内の処理が繰り返されます。

たとえば、変数iが0で、その値が10より小さい限り繰り返し加算するようなプログラムを考えましょう。ここでwhile文が活躍します。

○サンプルコード1:基本的なwhile文

基本的なwhile文の動作を理解するためのサンプルコードを見ていきましょう。

public class BasicWhileExample {
  public static void main(String[] args) {
    int i = 0; // 初期値
    while (i < 10) { // 条件式
      System.out.println("現在のiの値は " + i);
      i++; // iを1増加させる
    }
  }
}

このコードでは、整数型の変数iを0で初期化しています。

while文の条件式i < 10によって、iの値が10未満の場合にループが続きます。

ループ内でSystem.out.println("現在のiの値は " + i);が実行され、その後でiが1増加します。

このコードを実行すると、出力結果は現在のiの値は 0から現在のiの値は 9までが順に表示されます。

具体的には、

現在のiの値は 0
現在のiの値は 1
現在のiの値は 2
...
現在のiの値は 9

となります。

これで、iの値が0から9まで、10未満である限り処理が繰り返されていることが確認できました。

●while文の使い方

while文の基本について理解したら、次に進んでさまざまな応用方法について理解していきましょう。

ここでは、カウンターを用いた使い方や複数の条件を指定する方法、さらには無限ループとその制御について詳しく説明します。

○サンプルコード2:カウンターを用いたwhile文

while文はしばしばカウンター変数と組み合わせて使われます。

例えば、特定の処理を指定された回数だけ繰り返す場合などに役立ちます。

public class CounterWhileExample {
  public static void main(String[] args) {
    int counter = 0;
    while (counter < 5) { // counterが5未満の場合にループ
      System.out.println("カウンターの値は " + counter);
      counter++; // カウンターを1増やす
    }
  }
}

このコードの主要部分は、カウンター変数counterが5未満の間、ループを続ける点です。

ループ内でカウンターの値を表示後、1増加させます。

このコードを実行すると、カウンターの値が0から4まで、5回のループが行われます。

具体的な出力は、

カウンターの値は 0
カウンターの値は 1
カウンターの値は 2
...
カウンターの値は 4

となります。

○サンプルコード3:条件式で複数の条件を用いる

while文の条件式では複数の条件を組み合わせることもできます。

論理演算子(&&、||など)を使うことで、より複雑な条件を実現できます。

public class MultipleConditionsExample {
  public static void main(String[] args) {
    int a = 0, b = 0;
    while (a < 5 && b < 5) { // aもbも5未満の場合にループ
      System.out.println("aの値とbの値は " + a + ", " + b);
      a++;
      b += 2;
    }
  }
}

この例では、変数abがともに5未満の場合にループが続きます。

ループ内でそれぞれの値を表示後、aは1増加、bは2増加します。

コードを実行すると、次のような出力が得られます。

aの値とbの値は 0, 0
aの値とbの値は 1, 2
aの値とbの値は 2, 4

○サンプルコード4:無限ループとその中断

時には意図的に無限ループを作成する場合もありますが、そのような場合は制御構造を用いてループを適切に終了させる必要があります。

public class InfiniteLoopExample {
  public static void main(String[] args) {
    int i = 0;
    while (true) { // 無限ループ
      System.out.println("無限ループ " + i);
      i++;
      if (i >= 5) {
        break; // iが5以上になったらループを抜ける
      }
    }
  }
}

この例では、while(true)によって無限ループが生成されます。

しかし、i >= 5の条件が満たされた場合、break文によってループから抜け出します。

このコードを実行すると、「無限ループ 0」から「無限ループ 4」までの出力が5回表示され、その後でプログラムは終了します。

●while文と他のループ構文の比較

while文は非常に多様であり、多くのケースで使用できますが、Javaには他にもループを構築する方法があります。

主にfor文とdo-while文がそれです。

それぞれのループ構文の特性と使いどころを比較していきましょう。

○for文との比較

for文は特にカウンター制御のループにおいて便利です。

ここではfor文とwhile文を用いて同じ処理を行う例を挙げて説明します。

まずはfor文のサンプルです。

public class ForLoopExample {
  public static void main(String[] args) {
    for(int i = 0; i < 5; i++) {
      System.out.println("これはfor文です: " + i);
    }
  }
}

このコードは0から4までの数値を出力します。

変数iの初期値、条件、増加量が1行で書かれています。

次にwhile文で同じ処理を行うサンプルです。

public class WhileLoopExample {
  public static void main(String[] args) {
    int i = 0;
    while(i < 5) {
      System.out.println("これはwhile文です: " + i);
      i++;
    }
  }
}

このコードも0から4までの数値を出力しますが、初期値、条件、増加量が分散して記述されています。

for文のコードを実行すると「これはfor文です: 0」から「これはfor文です: 4」までが出力されます。

while文のコードを実行すると「これはwhile文です: 0」から「これはwhile文です: 4」までが出力されます。

結論として、for文は繰り返し回数が明確な場合やカウンターを使う場合に有効です。

一方で、while文は繰り返し回数が不明確な場合や外部からの入力に依存する場合に強いです。

○do-while文との比較

do-while文は少なくとも一回は処理が実行される点でwhile文と異なります。

まずはdo-while文のサンプルを見てみましょう。

public class DoWhileExample {
  public static void main(String[] args) {
    int i = 0;
    do {
      System.out.println("これはdo-while文です: " + i);
      i++;
    } while(i < 5);
  }
}

このコードを実行すると、「これはdo-while文です: 0」から「これはdo-while文です: 4」までが出力されます。

次に、while文で条件が最初から偽である場合のサンプルを見てみましょう。

public class WhileFalseExample {
  public static void main(String[] args) {
    int i = 5;
    while(i < 5) {
      System.out.println("これはwhile文です: " + i);
      i++;
    }
  }
}

このコードを実行すると、何も出力されません。

この違いから、do-while文は最低でも一回は実行される処理が必要な場合に用います。

一方、while文は最初から条件が偽でも問題ない場合に用います。

●while文の応用例

while文は基本的なループ処理から複雑なタスクまで幅広く活用できます。

ここでは、while文の応用例をいくつか取り上げます。

○サンプルコード5:配列の要素を順番に処理する

Javaで配列の要素を順番に処理する場合、for文がよく使用されますが、while文でも同様の処理が可能です。

public class ArrayWhileExample {
  public static void main(String[] args) {
    int[] numbers = {1, 2, 3, 4, 5};
    int i = 0;
    while(i < numbers.length) {
      // 配列の要素にアクセスして表示
      System.out.println("配列の要素: " + numbers[i]);
      i++;
    }
  }
}

このコードではnumbersという名前のint型の配列を用意しています。

while文を用いて、配列の要素に順番にアクセスしています。i < numbers.lengthという条件で、配列の長さを超えないようにしています。

実行すると、”配列の要素: 1″から”配列の要素: 5″までが順番に出力されます。

○サンプルコード6:ユーザーの入力を受け取る

while文はユーザーの入力に基づいてループを続けたり終了させたりする場面でよく見られます。

下記の例は、ユーザーから入力を受け取って、”exit”と入力されるまでループを続けるプログラムです。

import java.util.Scanner;

public class UserInputExample {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String input;

    while(true) {
      System.out.print("入力してください('exit'で終了): ");
      input = scanner.nextLine();

      if("exit".equals(input)) {
        System.out.println("プログラムを終了します。");
        break;
      }
      System.out.println("あなたの入力は: " + input);
    }
    scanner.close();
  }
}

このコードでは、Scannerクラスを用いてユーザーからの入力を受け取ります。

while文内でscanner.nextLine()メソッドを用いて入力を読み込み、”exit”が入力された場合にはbreakでループを抜けています。

このプログラムを実行すると、ユーザーが”exit”を入力するまで、入力された文字列が出力され続けます。

○サンプルコード7:ファイルの内容を行ごとに読む

ファイルの内容を読む際、while文を用いると、ファイルの終わり(EOF, End Of File)に達するまで続けられる処理を簡潔に書くことができます。

ここでは、JavaのBufferedReaderクラスを使用して、テキストファイルの各行を読み込むサンプルコードを紹介します。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ReadFileWithWhile {
  public static void main(String[] args) {
    // ファイルパスを指定
    String filePath = "example.txt";

    try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
      String line;
      // ファイルの終わりに達するまで読み込む
      while ((line = br.readLine()) != null) {
        // 読み込んだ行を出力
        System.out.println(line);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

このコードではBufferedReaderFileReaderクラスを用いて、example.txtという名前のテキストファイルを読み込んでいます。

while文の条件式にbr.readLine()を設定し、それがnullになる(ファイルの終わりに達する)までループを続けます。

このプログラムを実行すると、指定したテキストファイルexample.txtの内容が行ごとにコンソールに出力されます。

例えば、example.txtの中身が

Hello, World!
Java while loop example.

であれば、コンソールにも同様の文字列が行ごとに表示されます。

このように、while文はファイルの読み込みなど、事前に回数が決まっていないループ処理に適しています。

○サンプルコード8:複数のリストを同時に処理する

複数のリストや配列を同時に処理する場合でも、while文を用いることでコードを効率的に書くことができます。

二つのArrayListを同時に処理する例を紹介します。

import java.util.ArrayList;

public class MultipleListsExample {
  public static void main(String[] args) {
    ArrayList<String> names = new ArrayList<>();
    ArrayList<Integer> ages = new ArrayList<>();

    names.add("Alice");
    names.add("Bob");
    names.add("Charlie");

    ages.add(25);
    ages.add(30);
    ages.add(35);

    int i = 0;
    // 二つのリストが同じサイズである前提
    while (i < names.size()) {
      // 同じインデックスでデータを取得して処理
      System.out.println("Name: " + names.get(i) + ", Age: " + ages.get(i));
      i++;
    }
  }
}

このコードでは、namesagesという二つのArrayListを用意し、それぞれにデータを追加しています。

while文を使って、二つのリストの要素に同時にアクセスし、処理をしています。コンソール出力の結果は、

Name: Alice, Age: 25
Name: Bob, Age: 30
Name: Charlie, Age: 35

となります。

この方法は特に、複数のリストが同じ長さである、もしくは一方のリストが他方のリストの長さに依存している場合に便利です。

●注意点と対処法

while文は非常に便利な構文ですが、それだけに注意しなければならない点もいくつかあります。

ここではその主要な注意点と、問題が起こったときの対処法について詳しく説明します。

○無限ループに陥らないために

無限ループとは、ループが終了しない状態を指します。

この状態になるとプログラムは止まらず、コンピュータのリソースを無駄に消費します。

特にwhile文は条件が満たされている限りループが続くため、無限ループに陥りやすいです。

こちらが無限ループに陥る一例です。

public class InfiniteLoopExample {
  public static void main(String[] args) {
    int i = 0;
    while (i >= 0) { // この条件は常にtrueです
      i++;
    }
  }
}

このコードを実行すると、iの値は常に0以上であるため、while文は永遠に続きます。

解決策としては、ループ条件をしっかりと考え、ループがいつ終了するのか確認することが重要です。

また、何らかの手段でループを強制終了できるようにしておくことも有用です。

例えば、次のようにbreak文を用いる方法があります。

public class PreventInfiniteLoop {
  public static void main(String[] args) {
    int i = 0;
    while (true) {
      if (i >= 10) {
        break; // iが10以上になったらループを終了
      }
      i++;
    }
  }
}

このコードでは、iが10以上になるとbreak文が実行され、whileループが終了します。

○CPU使用率を抑制する方法

while文が高速にループすると、CPU使用率が高くなる可能性があります。

このような状況は、特にリアルタイム処理が不要な場合に避けたいところです。

そのための一つの方法は、Thread.sleep()メソッドを使用して、whileループの各イテレーションの間に小さな遅延を挿入することです。

public class CPURateControl {
  public static void main(String[] args) {
    int i = 0;
    while (i < 1000) {
      // 何らかの処理
      i++;

      try {
        Thread.sleep(100); // 100ミリ秒遅延を挿入
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

このコードでは、whileループの各回の実行後に100ミリ秒の遅延が挿入されます。

その結果、CPUの負荷が軽減される場合があります。

●カスタマイズ方法

while文の基本的な使い方や注意点について説明しましたが、更に柔軟なループ処理を実現するためには、いくつかのカスタマイズ方法があります。

ここでは、そのような高度な使い方について、サンプルコードを交えて解説します。

○while文の中でbreakとcontinueを活用する

Javaにおいて、while文をより制御するためのキーワードとしてbreakcontinueがあります。

breakはループを完全に終了するための命令です。

一方、continueはループの現在のイテレーションをスキップして次に進む命令です。

public class BreakAndContinueExample {
    public static void main(String[] args) {
        int i = 0;
        while (i < 10) {
            if (i == 5) {
                break; // iが5になった時点でループを終了
            }
            System.out.println("i: " + i);
            i++;
        }

        int j = 0;
        while (j < 10) {
            if (j == 5) {
                j++;
                continue; // jが5の時は出力をスキップ
            }
            System.out.println("j: " + j);
            j++;
        }
    }
}

このサンプルコードでは、breakcontinueを使用しています。

まずbreakの例では、iが5になったらループが終了します。

この結果として、出力はi: 0からi: 4までの5行となります。

次にcontinueの例では、jが5になった場合にそのイテレーションだけをスキップします。

その結果、出力はj: 0からj: 9までで、j: 5が省かれます。

○ネストしたwhile文の作成

while文は他のwhile文の中に配置することができ、これをネストと言います。

ネストしたwhile文は、外側のループが一回行われるごとに内側のループが全て実行されます。

public class NestedWhileExample {
    public static void main(String[] args) {
        int i = 0;
        while (i < 3) {
            int j = 0;
            while (j < 3) {
                System.out.println("i: " + i + ", j: " + j);
                j++;
            }
            i++;
        }
    }
}

このコードでは外側のwhileループがi < 3の条件で動作し、内側のwhileループがj < 3の条件で動作します。

結果として、ijの各組み合わせについて出力されます。

具体的には、i: 0, j: 0からi: 2, j: 2までの組み合わせが出力されます。

まとめ

本記事では、Java言語におけるwhile文の多角的な活用法を解説しました。

基本的な構造から始め、さまざまな使い方、注意点、そしてカスタマイズ方法に至るまで、幅広いテーマをカバーしています。

この記事を通じて、while文の多様な使い方と、それに付随するテクニックや注意点が明確になったでしょう。

是非とも、今回紹介した内容を自分のコードに取り入れて、より洗練されたプログラムを書くための一歩としてください。

これからもJavaプログラミングのスキルを高めていくためには、実践を重ねることが最も重要です。

お読みいただき、ありがとうございました。