Document

配
列
Java における配列
− その1 −
和田@数理情報科学
配列を参照する変数宣言
要素の型が基本型でも参照型でも型宣言で
型[ ] 変数名 ;
と書くことで、配列を参照する変数宣言になります。例えば、
整数の配列の宣言 : int[ ] x ;
実数の配列の宣言 : double[ ] y ;
文字列の配列の宣言: String[ ] s ;
こうしてできた変数は、数学で言うところの一次元配列
(ベクトル)となります。(整数ベクトル x を宣言)
配
列
配列インスタンスの作成
配列の場合、インスタンスを作成する時点で配列内の要素数を
規定しなければいけません。インスタンスの作成は、
new 型名[要素数]
とキーワード new を用いて行います。例えば、
100 個の要素を持つような int 型配列の作成は、
new int[100]
10 個の要素を持つような String 型配列の作成は、
new String[10]
配
列
配列の作成
要素が 10 個の int 型配列 x を作成する
int[ ] x = new int[10] ;
x
変数 x に代入されるのは、
配列インスタンスの先頭の
アドレス
インスタンス内では、[0] から順に
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
[9] まで番号づけされていて、それぞれ x[0], x[1], …, x[9]
と区別する。このとき、x[10] は無い!
配
列
配
列
値の代入・参照
配列 x の[3] 番目に整数値 7 を代入するには、
x[3] = 7 ;
x
と代入すれば良い
x[4] = 2 ; として、
x[8] = x[3]+x[4]; とすると?
7 2
9
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
配列の初期値
まず、空っぽの配列を作っておいてから、1つずつ値を代入
する方法もアリだが、少々面倒!
配列を宣言する際に初期値として一挙に値を代入する方法が
ある
int[ ] x = { 1, 3, 8, 0, 2, 2, 5, 4, 0, 6 } ;
代入文の右辺にカンマで区切って中カッコで括った値を置くこ
とで、一挙に配列の大きさと
値を与えることができる
x
1 3 8 0 2 2 5 4 0 6
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
配
列
配列の配列(2次元配列)
int[ ] x = new int[3] ; の3つの配列を1つの配列にまとめる
int[ ] y = new int[2] ;
int[ ] z = new int[4] ; x[1] = 2 ;
x
w
int[ ][ ] w = new int[3][ ] ;
w[0] = x ;
w[1] = y ;
w[2] = z ;
y
[0]
2
[0] [1] [2]
[1]
[2]
z
[0] [1]
このとき、w[0][1] は x[1] と同じ値を
参照している。w[0][1] = x[1] = 2
[0] [1] [2] [3]
配
列
配列の配列(2次元配列)
このとき、w[0][1] には整数 2 が入っているのに対し、
w[0] には x に入っていると等しい(1次元配列への)参照値が
入っている。
つまり、w[0] の型は int[ ]
int[ ] u = w[0] ;
int v = w[0][1] ;
u
w
y
[0]
int[ ] 型
int 型
w
w[i], x, y, z, u
w[i][j], x[j], y[j],…,
v
v
2
2
[0] [1] [2]
[1]
[2]
int[ ][ ] 型
x
z
[0] [1]
[0] [1] [2] [3]
配
列
配
列
行列
1次元配列は数学でのベクトルであれば、数学での行列は2次
元配列に対応する
w
但し、ぶら下がっている1次元配列の
長さが全て等しい。先のように
別々に1次元配列を作って1つに
まとめるのは面倒 → 1度に宣言する
[0]
[0] [1]
[1]
[2]
[0] [1]
int[ ][ ] w = new int[3][2] ;
3 2の整数行列の出来上がり。但し、値はまだ
入っていない
[0] [1]
2次元配列の初期値
2次元配列の場合も、値を1つずつ代入するのでなく、一挙に
初期値として与える方法がある
int[ ][ ] w = { { 2, 5, 0 }, { 1, 4 }, { 3, 0, 2, 7 } };
2重構造の中カッコで配列の値を代入する
w
2 5 0
[0]
[1]
[2]
[0] [1] [2]
1 4
[0] [1]
3 0 2 7
[0] [1] [2] [3]
配
列
単一変数と配列の違い
次の2つの処理を比較してみよう
int a = 1;
int b = a;
a = 2;
System.out.println( a + “,” + b);
a の値を b にコピー、
その後 a の値を変更!
よって、a の値と b の値
は異なってくる
int[ ] a = {1}; //1つしか入っていない配列
a の値は 1 でない!
int[ ] b = a;
a[0] の値が 1!
a[0] = 2;
System.out.println( a[0] + “,” + b[0] ); a の値はアドレスだから、
b も(同じ)アドレス。
配
列
値の交換
変数 x と y に入っている値を交換するにはどうすれば良いだ
ろう。以下のようにするとマズイのはわかるかな
int x = 1 ;
int y = 2 ;
y = x ;
x = y ;
System.out.println( “(x, y) = (” + x + “,” + y + “)” );
x
y
配
列
値の交換
変数 x と y に入っている値を交換するにはどうすれば良いだ
ろう。以下のようにするとマズイのはわかるかな
int x = 1 ;
int y = 2 ;
y = x ;
x = y ;
System.out.println( “(x, y) = (” + x + “,” + y + “)” );
1
x
1
y
では、どうすれば?
配
列
値の交換
2つの値の交換には、もう1つの記憶域が必要となる
int x = 1 ;
int y = 2 ;
int z = y ;
y = x ;
x = z ;
System.out.println( “(x, y) = (” + x + “,” + y + “)” );
1
x
2
y
2
z
配
列
配
列
参照変数の値の交換
2つの1次元配列 x と y の中身を交換したいときどうすれば
良いだろう
int[ ] x = {1, 2, 3} ;
int[ ] y = {4, 5, 6} ;
int w = x[0] ;
x[0] = y[0] ;
y[0] = w ;
w = x[1] ;
x[1] = y[1] ;
y[1] = w ;
:
x
y
1
2
3
[0] [1] [2]
4
5
6
[0] [1] [2]
配
列
参照変数の値の交換
2つの1次元配列 x と y の中身を交換したいときどうすれば
良いだろう
int[ ] x = {1, 2, 3} ;
int[ ] y = {4, 5, 6} ;
int[ ] w = x ;
x=y;
y=w;
w
x
y
1
2
3
[0] [1] [2]
4
5
6
[0] [1] [2]