連載
» 2009年03月30日 00時00分 公開

【改訂版】Eclipseではじめるプログラミング(5):データ集合を扱うのに便利なJavaの配列と拡張for文 (2/3)

[小山博史,株式会社ガリレオ]

インデックスと配列の長さ

 このようにして作成した配列内の配列要素を設定したり、参照したりするには、その位置を指定します。

 位置は「インデックスインデックス)」(「添字」ともいいます)によって指定できます。これは0から始まり、配列の長さをlengthとすると、最終要素のインデックスはlength-1となります。インデックスは「ブラケット」[ ]の中に書きます。

 なお、配列の長さは「配列変数名.length」とすることで参照できます。

 例えば、配列bdの2番目の要素へ値を設定し、この値と配列の長さを画面へ出力するには、次のようにします。2番目の要素を指定するためには、インデックス値は2-1、つまり1であることに注意してください。

bd[1] = 12;
System.out.println(bd[1]);
System.out.println(bd.length);

 インデックスとして指定できる式はint型でなければなりません。これにより、配列の最大長は制限されています。

コラム 「“空(empty)”の配列ってどういうこと?」

ただし、長さが0の配列を作ることはでき、これを「空(empty)配列」といいます。次のように、配列を作成するときに長さを0と指定すれば、空配列になります。

bd = new long[0];


配列を作って参照してみると……

 それでは、配列を使ってリスト1を単純に書き直してみましょう。配列を参照して、その値を出力するプログラムを作成します。ただし、リスト1を直接修正するのではなく、リスト1のときと同様に新しくクラス「Sample51」を作成しましょう。出来上がったSample51クラスをリスト2のように編集してください。

リスト2 
public class Sample51 {
    public static void main(String[] args) {

        long[] bd;
        bd = new long[6];

        bd[0] = 19700101;
        bd[1] = 19750101;
        bd[2] = 19800101;
        bd[3] = 19850101;
        bd[4] = 19900101;
        bd[5] = 0;

        if (bd[0] != 0) System.out.println(bd[0]);
        if (bd[1] != 0) System.out.println(bd[1]);
        if (bd[2] != 0) System.out.println(bd[2]);
        if (bd[3] != 0) System.out.println(bd[3]);
        if (bd[4] != 0) System.out.println(bd[4]);
        if (bd[5] != 0) System.out.println(bd[5]);
    }
}

 リスト2のプログラムを保存してから実行すると、生年月日の一覧が画面へ出力されて、下記のようになります。リスト1とまったく同じ出力がされることが分かるはずです。

リスト2の実行結果
19700101
19750101
19800101
19850101
19900101

配列は“反復処理”で参照しないと不便

 リスト2を見て、配列はとても便利だと思った読者はいないと思います。配列はどうやって使うと便利なのかを考えてみましょう。

 ここで、「インデックスとして指定できる式はint型」ということを思い出すともっとうまい書き方があるのに気付きます。そうです、前回の「プログラミングの真骨頂! Javaで“反復処理”を覚える」で学習した繰り返し文が使えるのです。繰り返し文を使ってリスト2を書き直してみましょう。

 なお、配列変数も宣言と同時に初期化ができるので、それも考慮します。これも、リスト2を直接修正するのではなく、新しくクラスを作成しましょう。リスト1のときと同様に新しくクラス「Sample52」を作成しましょう。出来上がったSample52クラスをリスト3のように編集してください。

リスト3 
public class Sample52 {
    public static void main(String[] args) {

        long[] bd = new long[6];//宣言と同時に初期化

        bd[0] = 19700101;
        bd[1] = 19750101;
        bd[2] = 19800101;
        bd[3] = 19850101;
        bd[4] = 19900101;
        bd[5] = 0;

        for (int i = 0; i < bd.length; i++) {
            if (bd[i] != 0) {
                System.out.println(bd[i]);
            }
        }
    }
}

 リスト3を見て分かるように、配列を使ったfor文の基本は、カウンタ(ここではi)を0から開始して、配列の長さ(ここでは、「bd.length」)未満の間、反復処理をするようにします。

 リスト3のプログラムを保存して実行すると、生年月日の一覧が画面へ出力されます。リスト2とまったく同じ結果が出力されるはずなので、結果は省略します。

 このように配列を使うと、かなりすっきりするのが分かるはずです。データの一覧表示をする処理の部分は変更しなくても、扱うデータの量に応じて配列の長さを設定して配列を作成すれば、そのまま動作します。どうでしょう、配列の有効性が分かってきたと思います。

「拡張for文」でもっと便利に!

 今回のプログラムのように、配列の要素すべてに対して同じ処理をしたいことは多いのですが、そのたびに「カウンタ」となる変数を宣言して1ずつ増加させて配列の要素を参照するようにコーディングをするのは面倒です。

 そこで、Javaでは「拡張for文」というfor文が用意されていて、リスト3をもっと簡単に記述できます。

拡張for文の書き方

 拡張for文の文法は、次のようになります。「集合式」という用語が出てきていますが、ここでは集合式の1つに配列があると覚えておけば十分です。

for (型 繰り返し用変数名 : 集合式) 処理

今度はEclipseのコピー機能を使ってみよう

 文法を見てもイメージがわかないでしょうから、拡張for文を使ってリスト3を書き直して比較して理解することにしましょう。これまでは新規でクラスを作ってきましたが、ここではSample52.javaをコピーしてSample53.javaを作ってみます。

  1. [パッケージ・エクスプローラー]の[Sample52.java]をマウス右ボタンでクリック
  2. 表示されるポップアップメニューで[コピー]を指定
  3. [パッケージ・エクスプローラー]の[(デフォルト・パッケージ)]をマウス右ボタンでクリック
  4. 表示されるポップアップメニューで[貼り付け]を指定
  5. 表示される[名前の競合]ダイアログで、「Sample53」と入力
  6. [OK]ボタンをクリック

 出来上がったSample53.javaを編集するには、[パッケージ・エクスプローラー]の[Sample53.java]をマウス左ボタンでダブルクリックします。Eclipseの中央の領域にSample53.javaが表示されますから、リスト4のように編集してください。for文のところだけ修正します。

リスト4 
public class Sample53 {
    public static void main(String[] args) {

        long[] bd = new long[6];

        bd[0] = 19700101;
        bd[1] = 19750101;
        bd[2] = 19800101;
        bd[3] = 19850101;
        bd[4] = 19900101;
        bd[5] = 0;

        for (long v : bd) {
            if (v != 0) {
                System.out.println(v);
            }
        }
    }
}

拡張for文は、ここが便利!

 Sample53.javaでは拡張for文を使っているので、for文の「( )」で各要素を変数vで参照することを宣言し、「:」の後に要素を持つ配列を指定しています。for文の「{ }」内の処理について、Sample52.javaでは配列の要素はbd[i]と書いて参照していましたが、Sample53.javaではvで参照できるようになります。

 また、Sample52.javaではカウンタ変数であるiの値を増加させるために「i++」という後処理が必要でしたが、拡張for文ではわざわざその処理を記述する必要はありません。

 リスト4のプログラムを保存して実行すると、リスト2とまったく同じ結果が出力されるはずなので、結果は省略します。配列の要素すべてに対して単純な処理を適用するような反復処理では、拡張for文を使った方がコーディング量が少なくてすみますし、プログラムが読みやすくなります。覚えておくとよいでしょう。

 次ページでは、配列のコピーの仕方について説明します。実は、配列のコピーには大きな問題があるので、ぜひ参照してください。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。