配 列 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]
© Copyright 2024 ExpyDoc