1. 2次元配列

配列に関する興味深い事実がもう 1 つあります。配列は 1 次元 (線形) だけではありません。2 次元にすることもできます。

それはどういう意味ですか?

これは、配列のセルが列 (または行) だけでなく、長方形のテーブルも表すことができることを意味します。

int[][] name = new int[width][height];

ここで、nameは配列変数の名前、widthはテーブルの幅 (セル単位)、heightはテーブルの高さです。例:

int[][] data = new int[2][5];
data[1][1] = 5;
2 列 5 行の 2 次元配列を作成します。
セル (1, 1) に 5 を書き込みます。

メモリ内では次のようになります。

2次元配列

ちなみに、2 次元配列に対して高速初期化を使用することもできます。

// Lengths of months of the year in each quarter
int[][] months = { {31, 28, 31}, {30, 31, 30}, {31, 31, 30}, {31, 30, 31} };

プログラマーとして 2 次元配列が必要になる場所は数多くあります。2 次元配列は、チェス、チェッカー、三目並べ、海戦など、ほぼすべてのボード ゲームの基礎です。

2 次元配列 2

2 次元配列はチェスや海戦に最適です。必要なのはセル座標の数値だけです。「ポーン e2-e4」ではなく、「ポーン (5,2) -> (5,4)」です。プログラマーにとってはさらに簡単になります。


2. 要素を配列に配置: (x, y) または (y, x)

ところで、ここには興味深いジレンマがあります。

を使用して配列を作成するとき、「25new int[2][5];」のテーブルがありますか、それとも「25」ですか?」つまり、最初に幅を指定してから高さを指定します...またはその逆は、最初に高さ、次に幅ですか? よく言われるように、ここではすべてがそれほど単純ではありません。

配列がメモリにどのように格納されるかという問題から始めましょう。

もちろん、コンピューターのメモリには実際には行列がありません。メモリ内の各場所には、0、1、2、... という連続した数値アドレスがあります。この場合、2 × 5 の行列について話しますが、メモリ内ではそれは単なる 10 個の連続するセルであり、それ以上のものではありません。行と列がどこにあるかを示すものはありません。

「幅×高さ」を支持する議論。

このアプローチを支持する議論は、誰もが学校で数学を学び、そこで座標のペアが「x」(つまり、水平軸)、次に「y」(垂直寸法)と書かれることを学ぶということです。そして、これは単なる学校の基準ではなく、数学において一般に受け入れられている基準です。よく言われるように、数学について議論することはできません。そうですか?まず幅、次に高さですか?

「高さ x 幅」を支持する議論。

この立場に関しては、2 次元配列の高速初期化という興味深い議論もあります。実際、配列を初期化したい場合は、次のようなコードを書くことができます。

// Matrix of important data
int[][] matrix = { {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5} };

何も気づきませんか?これがあればどうなるでしょうか?

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {1, 2, 3, 4, 5}
};

コードにデータを 1 行ずつ書き込むと、2 行 5 列の行列が得られます。

結論

何と言えますか? どちらが自分にとって便利かを決めるのはあなた次第です。最も重要なことは、同じプロジェクトに取り組むすべてのプログラマーが同じアプローチに固執することです。

コードに多数の初期化された 2 次元配列が含まれるプロジェクトに取り組んでいる場合、ほとんどの場合、そこにあるものはすべて高速データ初期化に基づいています。つまり、標準の「高さ x 幅」になります。

幸運にも、多くの数学を必要とし、座標を扱うプロジェクト (ゲーム エンジンなど) に携わることができた場合、コードは「幅 x 高さ」アプローチを採用する可能性が高くなります。


3. 2次元配列の配置方法

次に、2 次元配列が実際にどのように配置されるかを学びます。準備?

2 次元配列は実際には配列の配列です。

言い換えると、通常の配列の場合、配列変数が配列要素を格納するコンテナへの参照を格納する場合、2 次元配列の場合は状況が少し拡大します。2 次元配列変数には、 1 次元配列への参照を格納するコンテナへの参照。何百回も説明するよりも、一度実際に動作を確認する方が良いでしょう。

2次元配列の配置方法

左側には、2 次元配列オブジェクトへの参照を格納する 2 次元配列変数があります。の中に中央には2 次元配列オブジェクトがあり、そのセルには 2 次元配列の行である 1 次元配列が格納されます。そして右側には 4 つの 1 次元配列、つまり 2 次元配列の行が表示されます。

これが 2 次元配列が実際にどのように機能するかです。そして、このアプローチは Java プログラマーにいくつかの利点をもたらします。

まず、「コンテナのコンテナ」には「行の配列」への参照が保存されるため、非常に迅速かつ簡単に行を交換できます。「コンテナのコンテナ」を取得するには、インデックスを 2 つではなく 1 つ指定するだけです。例:

int[][] data = new int[2][5];
int[] row1 = data[0];
int[] row2 = data[1];

このコードにより、行を交換できます。

// Matrix of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {5, 4, 3, 2, 1}
};

int[] tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;
2 次元配列に





matrix[0]は、最初の行への参照が格納されます。
参照を交換します。

結果として、matrix配列は次のようになります。
{
  {5, 4, 3, 2, 1},
  {1, 2, 3, 4, 5}
};

2 次元配列のセルを参照しているが、配列名の後にインデックスを 1 つだけ指定している場合は、通常の 1 次元配列への参照を格納するセルを持つコンテナのコンテナを参照していることになります。