配列と拡張for文

拡張for文で配列を簡単に扱う

これまで見てきたように、配列はほとんどの場合for文と組み合わせて使われます。 そのため、配列やコレクションクラスなどを簡単に扱うための特別なfor文も用意されています。 このfor文は拡張for文(enhanced for statement)と呼ばれ、J2SE 5.0以降で利用できるようになったものです。

コレクションクラスについては後で学習します。

拡張for文に対して、第7章で学習したfor文は基本for文と呼ばれます。

拡張for文は、次のような構文になります。

構文 : 拡張for文
for(要素の型 変数名 : 配列変数名){
    文1
    文2
    ...
}

配列変数名で指定された配列の先頭から、要素を次々に取り出しながら繰り返しを実行していきます。 そして、配列本体では、変数名を使ってその要素にアクセスすることができます。 インデックスで各要素を指定する必要はありません。

それでは、拡張for文の使用例を見てみましょう。 ArraySample09は、いろいろな半径に対する円周を計算するプログラムです。

ArraySample09.java
class ArraySample09 {
    public static void main(String[] args) {
        double[] radii = {1.0, 2.0, 3.0, 4.0};
        double pi = 3.14;

        for(double radius : radii){
            System.out.println("半径" + radius + "の円の円周 = " + 2 * pi * radius);
        }
    }
}
ArraySample09の実行結果
半径1.0の円の円周 = 6.28
半径2.0の円の円周 = 12.56
半径3.0の円の円周 = 18.84
半径4.0の円の円周 = 25.12

ArraySample09では、配列の初期化により、配列radiiに4つの半径を格納しています。

        double[] radii = {1.0, 2.0, 3.0, 4.0};

英語のradiusとは半径という意味で、radiiはその複数形です。

そして、拡張for文では、配列radiiの先頭から順番に要素を取り出し、それを変数radiusに代入しながら、繰り返しを実行していきます。

        for(double radius : radii){
            System.out.println("半径" + radius + "の円の円周 = " + 2 * pi * radius);
        }

1回目の繰り返しでは、変数radiusにはradii[0]の値、即ち1.0が格納されています。 したがって、「2 * pi * radius」の値は、6.28となります。 2回目の繰り返しでは、変数radiusにはradii[1]の値、即ち2.0が格納されて....というように繰り返えされていきます。 4回目の繰り返しが終わるとループを抜け出します。

表 8-2 : ArraySample09での拡張for文の流れ
繰り返し回数 radiusの値 2 * pi * radius
の値
表示内容
1 1.0 6.28 半径1.0の円の円周 = 6.28
2 2.0 12.56 半径2.0の円の円周 = 12.56
3 3.0 18.84 半径3.0の円の円周 = 18.84
4 4.0 25.12 半径4.0の円の円周 = 25.12

拡張for文は、先頭から順番に各要素に取り出すことだけに向いています。 最後尾から先頭に向かって要素を取り出していったり、配列の途中から要素を取り出していくこと等は、スマートな形ではできません。 そういう処理には、拡張for文は向いていません。

また、各要素の値を取り出すことはできますが、各要素に値を代入することは、やはりスマートな形ではできません。 そういった処理のためには、基本for文を使って、インデックスによって各要素を指定する方法をとるべきでしょう。

もちろん、要素がString型のような参照型の場合でも、拡張for文は使えます。

ArraySample10.java
class ArraySample10 {
    public static void main(String[] args) {
        String[] versions = {"95", "98", "2000", "Me", "XP", "Vista", "7"};

        for(String ver : versions){
            System.out.println("Windows " + ver);
        }
    }
}
ArraySample10の実行結果
Windows 95
Windows 98
Windows 2000
Windows Me
Windows XP
Windows Vista
Windows 7

拡張for文を使うと、配列の各要素の値を簡単に取り出すことができる。