Java『for文の書き方』処理を指定の回数繰り返す|breakとcontinueの使い方

Java≫for文の書き方≫処理を指定の回数繰り返す_breakとcontinueの使い方 Javaプログラミング入門

【本サイトではGoogleアドセンス、または、アフィリエイト広告を利用しています。】

for文の書き方

for文は処理を指定した回数だけ繰り返す為の構文です。

同じ処理を何度も何度もプログラムで書くのは面倒ですし、
そもそも読みにくい、また、修正が必要になると、
すべての個所を洗い出して、同じ対応をしていかないといけなくなります。

 動かなくなったプログラム

なので、重複するプログラムはなるべく1つにまとめたいところです。

そんな特に使える構文の1つがこのfor文です。

for文の書き方は以下です。

for (初期化式; 条件式; 変化式) {
  処理
}

プログラムで例を書くとこのような感じです。

for (int i = 0; i < 10; i++) {
	System.out.println(i + "回目のループ処理です。");
}

forの後に処理を繰り返す為の条件式などを書きます。
また、中括弧の中に繰り返す処理を書きます。

と、ここで、公式に書かれた言葉ですが、なんのこっちゃだと思います。
特に「変化式」とか言われても、直感的じゃないのでわけわからないですよね。

 わからなくて困っている人

もう少しわかりやすく書くと、それぞれこのような用途で使います。

  • 初期化式 … ループ回数をカウントする為の変数を初期化する。
  • 条件式 … 処理をいつまでループするかを判定する為の条件を指定する。
  • 変化式 … ループする毎に実行する処理を指定する。

ちなみに、ループするとは、繰り返すという意味です。
プログラムでよく使うので覚えておきましょう!

基本的な考え方は以下でも説明していますので
あわせて読んでいただくとより理解が深まると思います!

for文の使い方|サンプルコード

公式がわかったところで、for文を使ったサンプルコードを書いてみましょう!

大きさが10ある配列に1から順番に数字を入れた後、
最後に配列の中身を出力してみます。

package example;

public class Example {
	public static void main(String[] args) {

		int[] array = new int[10];

		for (int i = 0; i < 10; i++) {

			// カウント数に1を足した値を配列に入れる
			array[i] = i + 1;

			// 出力
			System.out.println("配列" + i
					+ "番目の要素の値は、" + array[i] + "です。");
		}
	}
}

実行結果は以下です。

配列0番目の要素の値は、1です。
配列1番目の要素の値は、2です。
配列2番目の要素の値は、3です。
配列3番目の要素の値は、4です。
配列4番目の要素の値は、5です。
配列5番目の要素の値は、6です。
配列6番目の要素の値は、7です。
配列7番目の要素の値は、8です。
配列8番目の要素の値は、9です。
配列9番目の要素の値は、10です。

初期化式に定義しているカウント用の変数には、
一般的に、i、j、kなどのアルファベット小文字
を使います。

変数iは、for文の中にある処理が1回実行されるごとに、
変化式に書いた処理iインクリメントによって1ずつ増えていきます

また、配列に入れる値は1から始まりますが、
カウントは配列要素の開始番号にあわせて0から始めているので、
各要素には、カウント用の変数iに1を足した値を入れて出力していきます。

カウント用の変数を使いまわしするのが少し難しいようであれば、
以下のように、配列に値を入れる用の変数を別途定義しておいて、
for文の中で1を足してから配列に値を入れるようにしても良いと思います!

package example;

public class Example {
	public static void main(String[] args) {

		int[] array = new int[10];
		int value = 0;

		for (int i = 0; i < 10; i++) {

			// 変数valueに1を足す
			value++;

			// 変数valueの値を配列に入れる
			array[i] = value;

			// 出力
			System.out.println("配列" + i
					+ "番目の要素の値は、" + array[i] + "です。");
		}
	}
}

ただ、これだとステップ数が多くなることと、
プログラムのロジックとしては少し非効率です。

この辺りの書き方の違いが、プログラマーとしての腕の見せ所です!
よりシンプルに、効率の良い、そして、読みやすいプログラミングを目指しましょう!

ネスト処理とは?多重でループ処理を行う方法

プログラムにはネストと呼ばれる手法があります。

ネストとは、1つの構文の中に同じ構文を書く手法のことです。

日本語では「入れ子」にするとよく言われます。

例えば、for文の中に処理を書きますが、
そこにさらにfor文を書いてもいいわけです。

ネストを使って構文を複数重ねることで、複雑な処理を行うことができます。

 賢いプログラム

ということで、サンプルコードを見ていきましょう。

先ほどのサンプルコードに手を加えて、10×10の多次元配列にしましょう。
1~100まで値を入れて出力
してみます。

package example;

public class Example {
	public static void main(String[] args) {

		int[][] array = new int[10][10];

		for (int i = 0; i < 10; i++) {

			for (int j = 0; j < 10; j++) {

				// カウント数を使って計算した値を配列に入れる
				array[i][j] = (i * 10) + (j + 1);

				// 出力
				System.out.println("配列[" + i + "][" + j
						+ "]番目の要素の値は、" + array[i][j] + "です。");
			}
		}
	}
}

実行結果は長いのでちょっと省略して書きます。

配列[0][0]番目の要素の値は、1です。
配列[0][1]番目の要素の値は、2です。
配列[0][2]番目の要素の値は、3です。
配列[0][3]番目の要素の値は、4です。
配列[0][4]番目の要素の値は、5です。
…
配列[9][5]番目の要素の値は、96です。
配列[9][6]番目の要素の値は、97です。
配列[9][7]番目の要素の値は、98です。
配列[9][8]番目の要素の値は、99です。
配列[9][9]番目の要素の値は、100です。

多次元配列の構造にあわせて、
for文の中にfor文を書いて2重でループさせました。

1グループ目が変数iのループ、グループ内にある配列が変数jのループに
対応して動くイメージ
です。

出力内容とプログラムを照らし合わせて、
処理がどのような順番で動くのか追ってみてください!

途中でfor文を抜け出す方法|繰り返し処理のキャンセル

for文ですが、一度動き出すと止められないのでしょうか?

もう俺を止められるやつはいねーぜ!
的な無双状態なのかというと、ぜんぜんそうではありません。

 速いプログラム

for文はbreak文を使えばあっさり止められます

サンプルコードを見ていきましょう。

package example;

public class Example {
	public static void main(String[] args) {

		int[] array = new int[10];

		for (int i = 0; i < 10; i++) {

			// カウント数に1を足した値を配列に入れる
			array[i] = i + 1;
			System.out.println("配列" + i + "番目の要素の値は、"
					+ array[i] + "です。");

			// 5回カウントしたら終了させる
			if (i == 4) {
				break;
			}
		}
	}
}

実行結果は以下です。

配列0番目の要素の値は、1です。
配列1番目の要素の値は、2です。
配列2番目の要素の値は、3です。
配列3番目の要素の値は、4です。
配列4番目の要素の値は、5です。

if文を使って、ループが5週したタイミングでbreak文を実行させてみました。

うまく処理が5回目で止まってますね!

では、ネストした状態でbreak文を使うとどうなるでしょう?

package example;

public class Example {
	public static void main(String[] args) {

		int[][] array = new int[10][10];

		for (int i = 0; i < 10; i++) {

			for (int j = 0; j < 10; j++) {

				// カウント数を使って計算した値を配列に入れる
				array[i][j] = (i * 10) + (j + 1);

				// 出力
				System.out.println("配列[" + i + "][" + j
						+ "]番目の要素の値は、" + array[i][j] + "です。");

				// 5回カウントしたら終了させる
				if (j == 4) {
					break;
				}
			}
		}
	}
}

実行結果は以下です。

配列[0][0]番目の要素の値は、1です。
配列[0][1]番目の要素の値は、2です。
配列[0][2]番目の要素の値は、3です。
配列[0][3]番目の要素の値は、4です。
配列[0][4]番目の要素の値は、5です。
配列[1][0]番目の要素の値は、11です。
配列[1][1]番目の要素の値は、12です。
…
配列[8][3]番目の要素の値は、84です。
配列[8][4]番目の要素の値は、85です。
配列[9][0]番目の要素の値は、91です。
配列[9][1]番目の要素の値は、92です。
配列[9][2]番目の要素の値は、93です。
配列[9][3]番目の要素の値は、94です。
配列[9][4]番目の要素の値は、95です。

おっと!どうでしょう?予想通りでしたか?

グループごとにループが5回ずつ実行された形になりました
先ほどのサンプルと同じ結果にならないの?と思った人いないでしょうか?

なぜこのような結果になったのか?

それは、break文の性質にあります。

break文は、現在実行されているブロック(if文を除く)の処理を1つ抜ける
という性質を持っています。

つまり、サンプルコードでは、
ネストされた変数jのループ(2つ目のfor文のブロック)を抜ける
という動きをするので、

break文が実行されると、j=5~9のループ処理が飛ばされて
次の変数iのループ(次のグループの処理)が開始されます。

break文ですべてのブロックを脱出できるわけではないので、
注意して使いましょう!

continue文の使い方|処理を中断して次のループに移る

繰り返し処理を行っている時に、
処理を途中でやめて次のループに移りたいという場合が出てきます。

 悩んでいる人

先ほどのbreak文を使うと、ブロック全体を抜けてしまい、
for文が終了してしまうので、イメージしている動きとは少し違います。

そんな時に使えるのが、continue文です!

continue文とは、現在のブロックで動いているループ処理を中断して、
次のループ処理を開始する時に使う構文
です。

では、サンプルコードを見ていきましょう!
今回は、配列の要素に入っている値を出力する前に、
出力します!と宣言する動きになっています。

package example;

public class Example {
	public static void main(String[] args) {

		int[] array = new int[10];

		for (int i = 0; i < 10; i++) {

			// カウント数に1を足した値を配列に入れる
			array[i] = i + 1;

			// 出力(1回目)
			System.out.println("配列" + i + "番目の要素の値を出力します。");

			// 6回目以降は処理を中断
			if (i > 4) {
				continue;
			}

			// 出力(2回目)
			System.out.println("配列" + i + "番目の要素の値は、"
					+ array[i] + "です。");
		}
	}
}

実行結果は以下です。

配列0番目の要素の値を出力します。
配列0番目の要素の値は、1です。
配列1番目の要素の値を出力します。
配列1番目の要素の値は、2です。
配列2番目の要素の値を出力します。
配列2番目の要素の値は、3です。
配列3番目の要素の値を出力します。
配列3番目の要素の値は、4です。
配列4番目の要素の値を出力します。
配列4番目の要素の値は、5です。
配列5番目の要素の値を出力します。
配列6番目の要素の値を出力します。
配列7番目の要素の値を出力します。
配列8番目の要素の値を出力します。
配列9番目の要素の値を出力します。

6回目のループ以降からは要素の値を教えてくれなくなりました。

でも、これで動きとしては正解です。

プログラムの動きを説明すると、6回目のループ以降は、
if文の条件に入るので、continue文が実行されます。

すると、現在のループ内の処理は、continue文で終了するので、
以降の処理、つまり、配列要素の値を出力する処理は実行されません。

そして、そのまま次のループの処理に移ります。

では、for文をネストした場合はどうなるでしょう?

package example;

public class Example {
	public static void main(String[] args) {

		int[][] array = new int[10][10];

		for (int i = 0; i < 10; i++) {

			for (int j = 0; j < 10; j++) {

				// カウント数を使って計算した値を配列に入れる
				array[i][j] = (i * 10) + (j + 1);

				// 出力(1回目)
				System.out.println("配列[" + i + "][" + j
						+ "]番目の要素の値を出力します。");

				// 6回目以降は処理を中断
				if (j > 4) {
					continue;
				}

				// 出力(2回目)
				System.out.println("配列[" + i + "][" + j
						+ "]番目の要素の値は、" + array[i][j] + "です。");
			}
		}
	}
}

実行結果は以下です。長いので間は省略しています。

配列[0][0]番目の要素の値を出力します。
配列[0][0]番目の要素の値は、1です。
配列[0][1]番目の要素の値を出力します。
配列[0][1]番目の要素の値は、2です。
配列[0][2]番目の要素の値を出力します。
配列[0][2]番目の要素の値は、3です。
配列[0][3]番目の要素の値を出力します。
配列[0][3]番目の要素の値は、4です。
配列[0][4]番目の要素の値を出力します。
配列[0][4]番目の要素の値は、5です。
配列[0][5]番目の要素の値を出力します。
配列[0][6]番目の要素の値を出力します。
配列[0][7]番目の要素の値を出力します。
配列[0][8]番目の要素の値を出力します。
配列[0][9]番目の要素の値を出力します。
配列[1][0]番目の要素の値を出力します。
配列[1][0]番目の要素の値は、11です。
配列[1][1]番目の要素の値を出力します。
配列[1][1]番目の要素の値は、12です。
配列[1][2]番目の要素の値を出力します。
…
配列[8][9]番目の要素の値を出力します。
配列[9][0]番目の要素の値を出力します。
配列[9][0]番目の要素の値は、91です。
配列[9][1]番目の要素の値を出力します。
配列[9][1]番目の要素の値は、92です。
配列[9][2]番目の要素の値を出力します。
配列[9][2]番目の要素の値は、93です。
配列[9][3]番目の要素の値を出力します。
配列[9][3]番目の要素の値は、94です。
配列[9][4]番目の要素の値を出力します。
配列[9][4]番目の要素の値は、95です。
配列[9][5]番目の要素の値を出力します。
配列[9][6]番目の要素の値を出力します。
配列[9][7]番目の要素の値を出力します。
配列[9][8]番目の要素の値を出力します。
配列[9][9]番目の要素の値を出力します。

変数iのループは、飛ばされずに10回すべて実行されています。
変数jのループは、6回目以降が飛ばされた動きになっています。

つまり、break文の時と同じく、
continue文では、ブロック1つ分の処理を中断する動きとなります。

拡張for文とは?for文との違いと使い方

Javaには、for文の種類の1つとして、拡張for文というものがあります。

拡張for文とは、配列やコレクションを指定することで、
その要素数だけループする構文
です。

コレクションとは、配列に似たオブジェクトで、
複数の要素を順番に管理することのできるクラスです。
(Javaを始めたばかりの人は、まだ詳しく理解できなくても大丈夫です。)

拡張for文の特徴は以下です。

  • 配列やコレクションを指定するだけなので簡単。
  • カウント用の変数を用意する必要がない。
  • カウント用の変数がないので、何回目のループかどうかをプログラムの処理の中で使う時は別途変数を用意する必要がある。
  • 条件に指定した配列やコレクションの長さを変更(要素を追加したり削除したり)するような処理を行うとエラーになる場合がある。(for文では変更できる。)

for文との違いを見た時、簡易的で使いやすい部分もあれば、

ループのカウント数が取れなかったり、
条件に使う配列やコレクションの長さをいじれないという制約がある為、
ロジックによっては使いにくい部分も出てきます。

拡張for文の書き方は以下です。配列やコレクションの各要素が、
ループごとに順番に変数の中に入れ替わって入っていきます。

for (要素の型 要素の変数名 : 配列の名前、コレクションの名前) {
    処理
}

拡張for文を使ったサンプルコードです。
拡張for文の特徴にあわせて、カウント用の変数を別途用意しました。

package example;

public class Example {
	public static void main(String[] args) {

		int[] array = new int[10];
		int count = 0;

		for (int element : array) {

			// 現在のカウントに1を足した値を配列に入れる
			element = count + 1;

			// 出力
			System.out.println("配列" + count
					+ "番目の要素の値は、" + element + "です。");

			// カウントを1つ進める
			count++;
		}
	}
}

実行結果は以下です。

配列0番目の要素の値は、1です。
配列1番目の要素の値は、2です。
配列2番目の要素の値は、3です。
配列3番目の要素の値は、4です。
配列4番目の要素の値は、5です。
配列5番目の要素の値は、6です。
配列6番目の要素の値は、7です。
配列7番目の要素の値は、8です。
配列8番目の要素の値は、9です。
配列9番目の要素の値は、10です。

配列の要素を番号で指定しなくても、ループが進むごとに
変数elementに入れ替える形で要素が代入されていきます。

つまり、ループ1週目のelementにはarray[0]が、
2週目のelementにはarray[1]が入っている状態
で処理が進みます。

また、拡張for文には変化式の指定がないので、
カウントはループごとに自分でインクリメントして進めます。

このように、for文と拡張for文でメリット、デメリットがそれぞれあって、
作成する処理の内容によって使いやすさが変わってくるので、
特徴を掴んで上手に使い分けしていきましょう!

まとめ

for文の書き方について以下お話をしました。

  • for文の書き方と使い方
  • ネスト処理
  • for文を途中で抜ける方法(break文の使い方)
  • for文を中断して次のループに移る方法(continue文の使い方)
  • 拡張for文の書き方と使い方

処理を効率よく、シンプルに書く為には、
できるだけ同じ処理を1つにまとめる必要があります。

処理がループすると、各ループの中で使われる変数の値も変わっていくので、
頭の中で処理の流れをイメージしながら使うようにしましょう

また、配列を使う時は、0から始まる要素番号と、
1から始まるループ回数を混同しないように注意
しましょう。

次回は、while文の書き方についてお話をします!

タイトルとURLをコピーしました