[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

情報処理IIIA(Javaプログラミング入門)第6回

目次 索引
6.1 配列
6.1.1 配列とは
6.1.2 配列の使い方
6.1.3 配列の初期化
6.1.4 配列と繰り返し
6.1.5 配列の使用例
6.1.6 2次元配列
6.2 演習6
6.3 レポート課題

6.1 配列

6.1.1 配列とは

変数を用いますと、データを一つ格納できることはすでに学びました。 たくさんのデータを格納するには、データの個数だけ変数を用意すれば可能です。 しかし、これらのデータを系統的に取り扱うことは困難です。

配列array )というものを用いますと、たくさんのデータを系統的に格納することができます。 配列とは、データの「入れ物」が並んだものと考えてください。 次の図は、配列のイメージです。

An image of an array
図 6.1  配列のイメージ

配列には次のような特徴があります。

6.1.2 配列の使い方

変数を使うためには、変数の宣言が必要でした。 int x; のように変数を宣言しますと、変数 x に整数( int 型)が一つ格納できました。

配列を使うためには、配列の宣言と配列の生成という二段階の手続きが必要です。 次のプログラムは、配列を宣言し、生成し、その3番目に整数72を格納し、それを出力するものです。

/* 1*/ class ArrayTest {
/* 2*/     public static void main (String[] args) {
/* 3*/         int[] a;
/* 4*/         a = new int[10];
/* 5*/         a[3] = 72;
/* 6*/         System.out.println(a[3]);
/* 7*/     }
/* 8*/ }
b00a001@Ampere:~/java% java ArrayTest
72
b00a001@Ampere:~/java%

整数( int 型)の場合、配列の宣言は次のように書きます。

int[] arrayname;

ここで、 arrayname は配列の変数名です。 配列の生成は、

arrayname = new int[size];

と書きます。 ここで、 size は配列の大きさ(「入れ物」の個数)です。 今後、「入れ物」を配列の要素とよぶことにします。

上記のプログラムでは、3行目で変数名が a である配列を宣言しています。 また、4行目で大きさが10である配列を生成しています。

配列の要素にデータを格納するには、

arrayname[expression] = expression2;

と書きます。 expression 番目の要素に式 expression2 の値を格納します。 ここで、 expression は数そのものである必要はありません。 数を値に持つならば、変数や式でもかまいません。 例えば、変数 i の値が3で x の値が100ならば、 b[i - 1] = x + 1; によって配列 b の2番目の要素に101が格納されます。 式

arrayname[expression]

は、配列の expression 番目の要素に格納されたデータを値とします。 なお、配列の何番目の要素かを表すこの式 expression を、配列の 添え字subscript )、または インデックスindex )とよびます。

上記のプログラムでは、5行目で配列の3番目の要素にデータ72を格納しています。 また、6行目ではそのデータを取り出して出力しています。

上記のプログラムでにおいて、 a[10] は存在しないことに注意してください。 このような、存在しない要素にデータを格納しようとしたり、データを取り出そうとしますと、エラーが発生します。

なお、配列の大きさをどこかに記録しておく必要はありません。 これは、式

arrayname.length

によっていつでも取り出せます。

注意: 教科書によっては、配列の宣言は

int a[];

などと書くと説明しています。 Javaでは、 int[] a;int a[]; は同じ意味です。 ただし、これらを混在させるのは混乱のもとですので、この授業では前者に統一します。

6.1.3 配列の初期化

上記のイメージの通り、配列にデータを格納しましょう。 これは、配列の宣言、配列の生成、配列の要素への代入という手順を踏むとできます。 以下はそのようなプログラムの一部です。

int[] a;
a = new int[10];
a[0] = 99; a[1] = 90; a[2] = 81; a[3] = 72; a[4] = 63;
a[5] = 54; a[6] = 45; a[7] = 36; a[8] = 27; a[9] = 18;

次のように書きますと、配列の宣言と生成が同時に行えます。

int[] a = new int[10];
a[0] = 99; a[1] = 90; a[2] = 81; a[3] = 72; a[4] = 63;
a[5] = 54; a[6] = 45; a[7] = 36; a[8] = 27; a[9] = 18;

さらに、データの格納も同時に行うことができます。 これは次のように書きます。

int[] a = {99, 90, 81, 72, 63, 54, 45, 36, 27, 18};

このことを、配列の初期化とよびます。 配列の初期化では、キーワード new や配列の大きさは書きません。

6.1.4 配列と繰り返し

配列を処理するときは、 for 文による繰り返しがよく用いられます。

次のプログラムは、配列 b の要素に配列 a の要素をコピーし、 b の要素を出力した後、その総和を求めるものです。

/* 1*/ class ArrayIteration {
/* 2*/     public static void main (String[] args) {
/* 3*/         int i, sum = 0;
/* 4*/         int[] a = {99, 90, 81, 72, 63, 54, 45, 36, 27, 18};
/* 5*/         int[] b = new int[a.length];
/* 6*/         for (i = 0; i < a.length; i++) {
/* 7*/             b[i] = a[i];
/* 8*/         }
/* 9*/         for (i = 0; i < b.length; i++) {
/*10*/             System.out.println("b[" + i + "] is " + b[i]);
/*11*/         }
/*12*/         for (i = 0; i < b.length; i++) {
/*13*/             sum = sum + b[i];
/*14*/         }
/*15*/         System.out.println("The sum is " + sum);
/*16*/     }
/*17*/ }
b00a001@Ampere:~/java% java ArrayIteration
b[0] is 99
b[1] is 90
b[2] is 81
b[3] is 72
b[4] is 63
b[5] is 54
b[6] is 45
b[7] is 36
b[8] is 27
b[9] is 18
The sum is 585
b00a001@Ampere:~/java%

5行目で、配列 a と同じ大きさの配列 b を宣言し、生成します。 6行目から8行目でコピーが行われます。 式 a.length の値は10ですので、6行目の for 文では変数 i は0から9まで動きます。 これは、配列 a (および配列 b )の添え字の範囲と一致します。 9行目から11行目で配列 b の要素を出力します。 12行目から14行目で総和を計算します。

注意: 上記のプログラムで、6行目から8行目までの代わりに

b = a;

と書いても同じ出力が得られます。 ただし、これでは配列の要素はコピーされません。 まったく別の事が行われます。

6.1.5 配列の使用例

配列を使うプログラミングの例として、与えられた複数の長方形に対して、それらの面積の最大値を求めることを考えます。 ここで、長方形は次の通りとします。

表 6.1  長方形の大きさ
0 1 2 3 4
20 50 40 10 60
高さ 30 10 20 70 10

プログラムは以下のようになります。

/* 1*/ class MaximumArea {
/* 2*/     public static void main (String[] args) {
/* 3*/         int i, max;
/* 4*/         int[] width =  {20, 50, 40, 10, 60};
/* 5*/         int[] height = {30, 10, 20, 70, 10};
/* 6*/         max = width[0] * height[0];
/* 7*/         for (i = 1; i < width.length; i++) {
/* 8*/             if (width[i] * height[i] > max) {
/* 9*/                 max = width[i] * height[i];
/*10*/             }
/*11*/         }
/*12*/         System.out.println("Maximum area is " + max);
/*13*/     }
/*14*/ }
b00a001@Ampere:~/java% java MaximumArea
Maximum area is 800
b00a001@Ampere:~/java%

4行目では、長方形の幅のみを順に配列に格納します。 5行目では高さのみです。 このように格納しますと、 i 番目の長方形の幅は width[i] で、高さが height[i] で取り出せます。

変数 max は、その時点での面積の最大値を表します。 6行目で、取りあえず0番目の長方形の面積を最大値としておきます。 そして、1番目の長方形から順に面積を計算し、もし面積が max より大きかったら、変数 max にその値を格納しなおすのです。

6.1.6 2次元配列

配列は、データの「入れ物」を一列に並べたものでした。 一列ではなく、縦横に並べたものを、 2次元配列two-dimensional array )とよびます。 2次元配列のイメージは次のようになります。

An image of a two-dimensional array
図 6.2  2次元配列のイメージ

2次元配列の要素の、横の並びを row )、縦の並びを column )とよびます。 上記の例は3行4列の2次元配列です。 2次元配列は、表の形にデータをまとめる場合や、数学の行列を扱うときに用いられます。

整数( int 型)要素の2次元配列を格納する変数は、

int[][] arrayname;

と宣言します。 文

arrayname = new int[row][col];

によって、 rowcol 列の2次元配列を生成し、 arrayname に格納します。

2次元配列の要素にデータを格納するには、文

arrayname[expression1][expression2] = expression3;

を用います。 2次元配列 arrayname の(0番目から数えまして)上から expression 1 番目、左から expression 2 番目に、式 expression 3 の値を格納します。 このデータは、式

arrayname[expression1][expression2]

によって取り出せます。

次のプログラムは2次元配列の使用例です。 4行目で、変数 a を整数要素の2次元配列と宣言し、3行4列の2次元配列を生成して、 a に格納します。 5行目から7行目までで、配列の要素に数を代入します。 10行目で、代入された数を取り出して、それを画面に出力します。

/* 1*/ class TwoDimensional {
/* 2*/     public static void main (String[] args) {
/* 3*/         int i, j;
/* 4*/         int[][] a = new int[3][4];
/* 5*/         a[0][0] = 98; a[0][1] = 91; a[0][2] = 84; a[0][3] = 77;
/* 6*/         a[1][0] = 70; a[1][1] = 63; a[1][2] = 56; a[1][3] = 49;
/* 7*/         a[2][0] = 42; a[2][1] = 35; a[2][2] = 28; a[2][3] = 21;
/* 8*/         for (i = 0; i < 3; i++) {
/* 9*/             for (j = 0; j < 4; j++) {
/*10*/                 System.out.print(" " + a[i][j]);
/*11*/             }
/*12*/             System.out.println();
/*13*/         }
/*14*/     }
/*15*/ }
b00a001@Ampere:~/java% java TwoDimensional
 98 91 84 77
 70 63 56 49
 42 35 28 21
b00a001@Ampere:~/java%

配列のときと同様に、2次元配列でも初期化ができます。 上記のプログラムの4行目から7行目までを、次のようにまとめることができます。

int[][] a = {{98, 91, 84, 77},
             {70, 63, 56, 49},
             {42, 35, 28, 21}};

6.2 演習6

以下のような、点を番号順に直線で結んでいくと、ある図形が現れるというパズルを考えます。

Drawing a star
図 6.3  星型の描画

この例では星型になります。 この点の座標は次の通りです。 なお、点の番号は0から始めます。

表 6.2  星型の座標
0 1 2 3 4 5 6 7 8 9 10
x座標 100 82 24 71 53 100 147 129 176 118 100
y座標 20 75 75 109 165 131 165 109 75 75 20

このデータを用い、このパズルの要領で星型を描くJavaアプレットを作成してください。 点や番号は描画しないでください。 アプレットの大きさは、縦横200ピクセルです。 データの入力は、次の行をコピーアンドペーストするとよいでしょう。

100,  82,  24,  71,  53, 100, 147, 129, 176, 118, 100
 20,  75,  75, 109, 165, 131, 165, 109,  75,  75,  20

ポイントは、このデータを配列に格納し、 for 文の中でデータを取り出すことです。 drawLine を10行書くようなことはしないでください。 また、 drawPolygon を用いるのは反則とします。

余力のある人は、星型を適宜縮小、移動して、星型が複数個描かれたアプレットにしてください。


6.3 レポート課題

今日の演習6に従ってJavaプログラムを作成し、そのプログラムをkonishi@twcu.ac.jpあてにメールで提出してください。 メールには、学生番号、氏名、科目名、授業日(10/25)を明記してください。


[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

2001年10月25日更新
konishi@twcu.ac.jp
Copyright (C) 2001 Zenjiro Konishi. All rights reserved.