Since: Jan./15th/2004;
配列は一つのオブジェクトです。配列を代入する変数は、配列そのものを保持するのではなく、配列オブジェクトへのポインタを保持する参照型変数です。ここでは配列に関する規則を紹介して、より柔軟に配列が使えるようになることを目指します。
多次元配列は次のようにも定義できます。
String[][][][] args;
String[][][] args[];
String[][] args[][];
String[] args[][][];
String args[][][][];
上記の記述は全て同じくString型を要素とする四次元配列を参照する変数argsの定義です。
変数の宣言と定義とリストによる初期化まで含めると次のように書けます。
String[] args = {"Morning", "Afternoon", "Evening"};
一方、初期化しないで、変数argsの宣言と定義だけだと次のように書きます。
String[] args = new String[3];
オブジェクトの場合、後で紹介するパッケージ java.io
に関することですが、ストリームのラップで次のような書式が標準的でよく見かけます。
Reader bin = new BufferedReader(new FileReader("myText.txt") );
配列も参照型のオブジェクトの一つなので、次のような書き方があります。
obj.method(new String[] {"Morning", "Afternoon", "Evening", "Midnight"});
要するに、匿名配列とは、配列への参照を変数に代入しない方法です。上のコードは、次のコードと等価です。
String[] args = new String[4]; args[0] = "Morning"; args[1] = "Afternoon"; args[2] = "Evening"; args[3] = "Midnight"; obj.method(args);
ここで、method()
の定義は、例えば、次のようになります。
void method(String[] args) { // 処理 }
一次元配列はリストとも呼ばれます。カンマ区切りのベクトル型のデータです。二次元配列は行列とも呼ばれます。三次元配列は、要素をベクトルとする行列だと考えられます。四次元配列は、要素を行列とする行列と考えられます。一般に、二次元までは縦と横で分離して表現できるのでイメージしやすいのですが、三次元以上になると分かりにくいものです。
一次元配列を new
するには、次のように記述します。
int[] array1 = new int[4];
a0, a1, a2, a3 を int 型変数で定義しているとき、リストで記述すると、次のような形になります。
array1 = {a0, a1, a2, a3};
int[][] array2 = new int[4][2];
次のような形になります。
array2 = { {a00, a01}, {a10, a11}, {a20, a21}, {a30, a31}, };
int[][][] array3 = new int[4][2][3];
array3 = { { {a000, a001, a002}, {a010, a011, a012} }, { {a100, a101, a102}, {a110, a111, a112} }, { {a200, a201, a202}, {a210, a211, a212} }, { {a300, a301, a302}, {a310, a311, a312} }, };
各要素をベクトルとする4行2列の行列となっています。
次のように定義すると、
int[] bxx = {axx0, axx1, axx2};
次のように書くことができます。
array3 = { {b00, b01}, {b10, b11}, {b20, b21}, {b30, b31}, };
int[][][][] array4 = new int[4][2][3][2];
array4 = { { { {a0000, a0001}, {a0010, a0011}, {a0020, a0021} }, { {a0100, a0101}, {a0110, a0111}, {a0120, a0121} } }, { { {a1000, a1001}, {a1010, a1011}, {a1020, a1021} }, { {a1100, a1101}, {a1110, a1111}, {a1120, a1121} } }, { { {a2000, a2001}, {a2010, a2011}, {a2020, a2021} }, { {a2100, a2101}, {a2110, a2111}, {a2120, a2121} } }, { { {a3000, a3001}, {a3010, a3011}, {a3020, a3021} }, { {a3100, a3101}, {a3110, a3111}, {a3120, a3121} } } };
各要素を行列とする行列となっています。Java のコードとしては正しくありませんが、模式的に次のように書けば、要素を3行2列の行列とする4行2列の行列に見えるでしょうか?
array3 = { { { {a0000, a0001}, | { {a0100, a0101}, {a0010, a0011}, | {a0110, a0111}, {a0020, a0021} }, | {a0120, a0121} } }, -----------------------+----------------------- { { {a1000, a1001}, | { {a1100, a1101}, {a1010, a1011}, | {a1110, a1111}, {a1020, a1021} }, | {a1120, a1121} } }, -----------------------+----------------------- { { {a2000, a2001}, | { {a2100, a2101}, {a2010, a2011}, | {a2110, a2111}, {a2020, a2021} }, | {a2120, a2121} } }, -----------------------+----------------------- { { {a3000, a3001}, | { {a3100, a3101}, {a3010, a3011}, | {a3110, a3111}, {a3020, a3021} }, | {a3120, a3121} } } }
次のように定義すると、
int[] cxxx = {axxx0, axxx1};
要素をベクトルとする4×2×3の三次元配列として、次のように書くことができます。
array3 = { { {c000, c001, c002}, {c010, c011, c012} }, { {c100, c101, c102}, {c110, c111, c112} }, { {c200, c201, c202}, {c210, c211, c212} }, { {c300, c301, c302}, {c310, c311, c312} } };
同様に、次のように定義すると、
int[][] dxx = { {axx00, axx01}, {axx10, axx11}, {ax20, axx21} };
要素を三行二列の行列とする四行二列の行列として、次のように書くことができます。
array3 = { {d00, d01}, {d10, d11}, {d20, d21}, {d30, d31}, };
同様に、次のように定義すると、
int[][][] ex = { { {axx00, ax001}, {ax010, ax011}, {ax020, ax021} }, { {a0x00, ax101}, {ax110, ax111}, {ax120, ax121} } };
要素を2×3×2の三次元配列とするベクトルとして、次のように書けます。
array3 = {e0, e1, e2, e3};
配列変数は、要素の型が代入互換であり、かつ、次元が等しいときに代入互換です。特に、多次元配列の場合は、途中までインデックスを指定した配列要素に関しても、同様の規則が成り立ちます。