配列 (0)

初めての配列

この回では、配列の初歩的な使い方をマスターすることを目標とする。

配列とは

配列は複数のデータを扱うときに便利なデータ構造であり、同じ型のデータを一列に並べたものである。例えば、6個の整数型データ3, 5, 7, 9, 11, 13を一列に並べて扱うときは、

int[] a = {3, 5, 7, 9, 11, 13};

という宣言をすればよい。int[]int型の配列 を表す。その次の a が int 型の配列であるという宣言である (a がその配列の名前になる)。"=" 以下でその配列に初期値を与えている。配列 a の先頭の要素 (それは a[0] で表される) に値 3 を入れ、その次の要素 a[1] に値 5 を入れ、a[2] に 7、a[3] に 9、a[4] に 11、a[5] に 13 を入れることになる。配列 a の長さ (要素の数) は 6 になる。この配列 a に対して

System.out.println(a[4]);

を実行すれば 11 が出力される。

配列の生成

初期化付き生成

配列を作成する方法のひとつとして、各要素の初期値を決めて作成する方法がある。

int[] a = {10, 20, 30, 40};

上の例では、変数 a に「長さ4で初期値が順に10, 20, 30, 40の配列」を格納している。

double型の値を格納できる配列を作成する場合は、以下のようにすればよい。

double[] b = {1.0, 2.0, 3.0};

ところで、初期値は定数でなくてもかまわない。

double[] c = { Math.sqrt(2.0), Math.sqrt(2.0) * 2, Math.sqrt(3.0) };

上記のような式を含めても問題ない。

要素数を指定して生成

初期化付き生成では、値 (初期値) を並べることによって、その個数の長さを持つ配列を生成していた。初期値を与えずに配列を生成する場合は、次のように、配列の長さだけ指定すれば良い。

int[] a = new int[10];

上の例では、10 個の int の値を格納できる配列を作成している。それぞれの要素の初期値は 0 になる。

一般に、以下のような式で要素数を指定して配列を生成できる。

new 型の名前[要素数を表す式]

double型の値を格納できる、7個の要素を持つ配列を生成する場合は、以下のようにすればよい。

double[] b = new double[7];

また、要素数は定数ではなく計算式やメソッドの呼び出しの結果などを使用してもよい。ただし、int 型の値で指定してやる必要がある。

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("配列の大きさを入力:");
int size = Integer.parseInt(reader.readLine());
double[] c = new double[size];

上記の例では、配列の大きさをコンソールに入力させ、その要素数をもつ double 型の配列を作成する。

配列の大きさは、0 以上である必要がある。

配列要素の参照

配列の各要素を参照する場合は、次のようにする。

int[] a = {10, 20, 30};
int sum = a[0]+a[1]+a[2];

上の例のように、配列を表す変数 (または式) のあとに [] で、何番目の要素を指定するか書いてやればよい。この要素を指定する部分には定数だけではなく計算式などを使えるため、以下のように書くこともできる。

int[] a = {10, 20, 30};
int sum = 0;
for(int i=0; i<3; i++)
  sum += a[i]

配列の後ろにつけられる [数値] を添え字またはインデックス と呼ぶことが多い。

配列の各要素にデータを格納するには、次のようにする。

int[] a = new int[3];
a[0] = 100;
a[1] = 200;
a[2] = 300;

以下のプログラム断片の意味はすぐ分かるだろう。結果は上と同じ。

int[] a = new int[3];
for(int i=1; i<=3; i++)
  a[i] = 100*i;

配列長の取得

配列には、要素を格納するための箱だけでなく、配列の長さという情報も伴っている。

int[] a = {1, 2, 3};

上記の配列の長さは 3 であるが、その情報は a.length として得られる。配列 a の最後の要素(今の場合 a[2])は a[a.length-1] である。どんな配列 h についても、その最後の要素は h[h.length-1] である。

この情報を用いると、「配列の要素を順番に参照する」などのプログラムが簡単に書ける。

int[] a = {1, 2, 3};
for (int i = 0; i < a.length; i++) {
  System.out.println(a[i]);
}

これは擬似コードで書くと、以下のように表せる。

a = {1, 2, 3}
for i を 0 から (配列 a の長さ - 1) まで
  print a[i]

つまり、配列の全ての要素を 0 番目から順に表示するようなプログラムである。上に示したプログラムを実際に実行したとすると、以下のような結果が得られるはずである。

1
2
3

配列の型

これまでに int 型と double 型を学んできたが、今回で配列を学んだことにより型が2種類増える。つまり、「int配列型 (int[])」と「double配列型 (double[])」である。

これらはメソッドの各引数の型や戻り値の型としても使用することができる。

public static void main(String[] args) { 
  int[] a = createArray();
  ...
}

public static int[] createArray() {
  return new int[]{10, 20, 30, 40};
}

public static void printArray(int[] array) {
  for (int i = 0; i < array.length; i++) {
    System.out.println(array[i]);
  }
}

これまでに int[] を「int型の配列」と呼んでいたが、Javaを使う上では「int配列型」という認識をしたほうが楽である。Javaは型という考え方が非常に強いため、「int型の配列」という考え方では解釈が難しい場面がいくつかある。