目次 | 索引 |
---|---|
変数を用いますと、データを一つ格納できることはすでに学びました。 たくさんのデータを格納するには、データの個数だけ変数を用意すれば可能です。 しかし、これらのデータを系統的に取り扱うことは困難です。
配列 ( array )というものを用いますと、たくさんのデータを系統的に格納することができます。 配列とは、データの「入れ物」が並んだものと考えてください。 次の図は、配列のイメージです。
配列には次のような特徴があります。
int
型)の隣に文字列(
String
型)を格納したりはできません。
変数を使うためには、変数の宣言が必要でした。
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[];
は同じ意味です。
ただし、これらを混在させるのは混乱のもとですので、この授業では前者に統一します。
上記のイメージの通り、配列にデータを格納しましょう。 これは、配列の宣言、配列の生成、配列の要素への代入という手順を踏むとできます。 以下はそのようなプログラムの一部です。
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
や配列の大きさは書きません。
配列を処理するときは、
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;
と書いても同じ出力が得られます。 ただし、これでは配列の要素はコピーされません。 まったく別の事が行われます。
配列を使うプログラミングの例として、与えられた複数の長方形に対して、それらの面積の最大値を求めることを考えます。 ここで、長方形は次の通りとします。
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
にその値を格納しなおすのです。
配列は、データの「入れ物」を一列に並べたものでした。 一列ではなく、縦横に並べたものを、 2次元配列 ( two-dimensional array )とよびます。 2次元配列のイメージは次のようになります。
2次元配列の要素の、横の並びを 行 ( row )、縦の並びを 列 ( column )とよびます。 上記の例は3行4列の2次元配列です。 2次元配列は、表の形にデータをまとめる場合や、数学の行列を扱うときに用いられます。
整数(
int
型)要素の2次元配列を格納する変数は、
int[][] arrayname;
と宣言します。 文
arrayname = new int[row][col];
によって、 row 行 col 列の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}};
以下のような、点を番号順に直線で結んでいくと、ある図形が現れるというパズルを考えます。
この例では星型になります。 この点の座標は次の通りです。 なお、点の番号は0から始めます。
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に従ってJavaプログラムを作成し、そのプログラムをkonishi@twcu.ac.jpあてにメールで提出してください。 メールには、学生番号、氏名、科目名、授業日(10/25)を明記してください。