1.二維數組
關於數組的另一個有趣的事實。數組不僅是一維的(線性的)。它們也可以是二維的。
你問這是什麼意思?
這意味著數組的單元格不僅可以表示一列(或行),還可以表示一個矩形表格。
int[][] name = new int[width][height];
其中name是數組變量的名稱,width是表格寬度(以單元格為單位),height是表格高度。例子:
|
我們創建一個二維數組:2 列和 5 行。 將 5 寫入單元格 (1, 1)。 |
這是它在內存中的樣子:
順便說一句,您還可以對二維數組使用快速初始化:
// Lengths of months of the year in each quarter
int[][] months = { {31, 28, 31}, {30, 31, 30}, {31, 31, 30}, {31, 30, 31} };
作為程序員,您可能在很多地方都需要二維數組。二維數組是幾乎所有棋盤遊戲的基礎,例如國際象棋、西洋跳棋、井字遊戲和海戰:
二維陣列非常適合國際象棋或海戰。我們只需要數字形式的單元格坐標。不是'pawn e2-e4',而是'pawn (5,2) -> (5,4)'。作為程序員,這對你來說會更容易。
2.排列數組中的元素:(x, y) or (y, x)
順便說一句,這裡有一個有趣的困境:
當我們使用創建一個數組時,我們有一個“兩行五列new int[2][5];
”的表格還是“兩列五行”?換句話說,我們是先指定寬度然後指定高度......反之亦然,先高後寬?嗯,正如我們常說的,這裡的一切都不是那麼簡單。
先從數組在內存中如何存儲的問題說起。
當然,計算機內存中實際上並沒有矩陣:內存中的每個位置都有一個連續的數字地址:0, 1, 2, ... 在我們的例子中,我們說的是 2 × 5 矩陣,但在內存中它只是 10 個連續的單元格,僅此而已。沒有任何內容指示行和列的位置。
贊成“寬度 x 高度”的論點。
支持這種方法的論點是,每個人都在學校學習數學,在那裡他們了解到坐標對被寫為“x”(即水平軸),然後是“y”(垂直維度)。這不僅僅是一個學校標準——它是一個普遍接受的數學標準。正如他們所說,你不能與數學爭論。是這樣嗎?先寬後高?
支持“高度 x 寬度”的論點。
這個職位還有一個有趣的論點:二維數組的快速初始化。事實上,如果我們想初始化我們的數組,那麼我們可以這樣寫代碼:
// 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}
};
如果我們在代碼中逐行寫入我們的數據,那麼我們會得到一個 2 行 5 列的矩陣。
底線
我們能說什麼?由您決定哪個對您更方便。最重要的是,從事同一項目的所有程序員都堅持採用相同的方法。
如果您從事的項目的代碼包含大量已初始化的二維數組,那麼很可能那裡的所有內容都基於快速數據初始化,即您將擁有標準的“高度 x 寬度”。
如果您有幸發現自己在一個涉及大量數學和使用坐標的項目中(例如,遊戲引擎),那麼代碼很可能會採用“寬 x 高”方法。
3.二維數組如何排列
現在您將了解二維數組的實際排列方式。準備好?
二維數組實際上是數組的數組!
換句話說,如果在普通數組的情況下,數組變量存儲對存儲數組元素的容器的引用,那麼在二維數組的情況下,情況會稍微爆炸:二維數組變量存儲一個對存儲對一維數組的引用的容器的引用。最好只看一次,而不是嘗試解釋一百次:
在左側,我們有一個二維數組變量,它存儲對二維數組對象的引用。在裡面中間我們有一個二維數組對象,它的單元格中存放的是一維數組,也就是二維數組的行。在右側,您可以看到四個一維數組——我們的二維數組的行。
這就是二維數組的實際工作方式。這種方法為 Java 程序員提供了幾個優勢:
首先,由於“容器的容器”存儲對“行數組”的引用,我們可以非常快速且輕鬆地交換行。要獲得“容器的容器”,您只需指定一個索引而不是兩個。例子:
int[][] data = new int[2][5];
int[] row1 = data[0];
int[] row2 = data[1];
此代碼可讓您交換行:
|
二維數組matrix[0] 存儲對第一行的引用。我們交換參考。 結果, matrix 數組看起來像這樣:
|
如果您引用二維數組的一個單元格,但您只在數組名稱後指定一個索引,那麼您指的是一個容器的容器,其單元格存儲對普通一維數組的引用。
GO TO FULL VERSION