複雑な配列

Since: Jan./15th/2004;

配列は一つのオブジェクトです。配列を代入する変数は、配列そのものを保持するのではなく、配列オブジェクトへのポインタを保持する参照型変数です。ここでは配列に関する規則を紹介して、より柔軟に配列が使えるようになることを目指します。

配列変数定義方法

多次元配列は次のようにも定義できます。

String[][][][] args;
 
これは普通の四次元配列型。
String[][][] args[];
 
三次元配列の要素に一次元配列を持たせる型なので、全部で四次元配列型。
String[][] args[][];
 
二次元配列の要素に二次元配列を持たせる型なので、全部で四次元配列型。
String[] args[][][];
 
一次元配列の要素に三次元配列を持たせる型なので、全部で四次元配列型。
String args[][][][];
 
String型の四次元配列。

上記の記述は全て同じく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};

配列変数は、要素の型が代入互換であり、かつ、次元が等しいときに代入互換です。特に、多次元配列の場合は、途中までインデックスを指定した配列要素に関しても、同様の規則が成り立ちます。



Copyright © 2004 SUGAI, Manabu. All Rights Reserved.