????????為了方便組織各種信息,計(jì)算機(jī)常將信息以表的形式進(jìn)行組織,然后再以行和列的形式呈現(xiàn)出來。二維數(shù)組的結(jié)構(gòu)決定了其能非常方便地表示計(jì)算機(jī)中的表,以第一個(gè)下標(biāo)表示元素所在的行,第二個(gè)下標(biāo)表示元素所在的列。下面簡單了解一下二維數(shù)組,包括數(shù)組的聲明和初始化。
創(chuàng)建二維數(shù)組
????????在Java中二維數(shù)組被看作數(shù)組的數(shù)組,即二維數(shù)組為一個(gè)特殊的一維數(shù)組,其每個(gè)元素又是一個(gè)一維數(shù)組。Java 并不直接支持二維數(shù)組,但是允許定義數(shù)組元素是一維數(shù)組的一維數(shù)組,以達(dá)到同樣的效果。聲明二維數(shù)組的語法如下:
type arrayName[][];? ? // 數(shù)據(jù)類型 數(shù)組名[][];
或
type[][] arrayName;? ? // 數(shù)據(jù)類型[][] 數(shù)組名;
????????其中,type 表示二維數(shù)組的類型,arrayName 表示數(shù)組名稱,第一個(gè)中括號表示行,第二個(gè)中括號表示列。
????????下面分別聲明 int 類型和 char 類型的數(shù)組,代碼如下:
int[][] age;
char[][] sex;
初始化二維數(shù)組
????????二維數(shù)組可以初始化,和一維數(shù)組一樣,可以通過 3 種方式來指定元素的初始值。這 3 種方式的語法如下:
type[][] arrayName = new type[][]{值 1,值 2,值 3,…,值 n};? ? // 在定義時(shí)初始化
type[][] arrayName = new type[size1][size2];? ? // 給定空間,在賦值
type[][] arrayName = new type[size][];? ? // 數(shù)組第二維長度為空,可變化
例 1
使用第一種方式聲明 int 類型的二維數(shù)組,然后初始化該二維數(shù)組。代碼如下:
int[][] temp = new int[][]{{1,2},{3,4}};
上述代碼創(chuàng)建了一個(gè)二行二列的二維數(shù)組 temp,并對數(shù)組中的元素進(jìn)行了初始化。下圖為該數(shù)組的內(nèi)存結(jié)構(gòu)。

二維數(shù)組內(nèi)存結(jié)構(gòu)
????????使用第二種方式聲明 int 類型的二維數(shù)組,然后初始化該二維數(shù)組。代碼如下:
int[][] temp = new int[2][2];
????????使用第三種方式聲明 int 類型的二維數(shù)組,并且初始化數(shù)組。代碼如下:
int[][] temp = new int[2][];
獲取單個(gè)元素
????????在上部分使用的前 2 種方式創(chuàng)建并初始化了一個(gè)二行二列的 int 類型數(shù)組 temp。當(dāng)需要獲取二維數(shù)組中元素的值時(shí),也可以使用下標(biāo)來表示。語法如下:
arrayName[i-1][j-1];
????????其中,arrayName 表示數(shù)組名稱,i 表示數(shù)組的行數(shù),j 表示數(shù)組的列數(shù)。例如,要獲取第二行第二列元素的值,應(yīng)該使用 temp[1][1]來表示。這是由于數(shù)組的下標(biāo)起始值為 0,因此行和列的下標(biāo)需要減 1。
例 2
通過下標(biāo)獲取 class_score 數(shù)組中第二行第二列元素的值與第四行第一列元素的值。代碼如下:
public static void main(String[] args) {
double[][] class_score = {{10.0,99,99},{100,98,97},{100,100,99.5},{99.5,99,98.5}};
? ? System.out.println("第二行第二列元素的值:"+class_score[1][1]);
? ? System.out.println("第四行第一列元素的值:"+class_score[3][0]);
}
執(zhí)行上述代碼,輸出結(jié)果如下:
第二行第二列元素的值:98.0
第四行第一列元素的值:99.5
獲取全部元素
????????在一維數(shù)組中直接使用數(shù)組的 length 屬性獲取數(shù)組元素的個(gè)數(shù)。而在二維數(shù)組中,直接使用 length 屬性獲取的是數(shù)組的行數(shù),在指定的索引后加上 length(如 array[0].length)表示的是該行擁有多少個(gè)元素,即列數(shù)。
????????如果要獲取二維數(shù)組中的全部元素,最簡單、最常用的辦法就是使用 for 語句。在一維數(shù)組全部輸出時(shí),我們使用一層 for 循環(huán),而二維數(shù)組要想全部輸出,則使用嵌套 for 循環(huán)(2 層 for 循環(huán))。
例 3
使用 for 循環(huán)語句遍歷 double 類型的 class_score 數(shù)組的元素,并輸出每一行每一列元素的值。代碼如下:
public static void main(String[] args) {
double[][] class_score = { { 100, 99, 99 }, { 100, 98, 97 }, { 100, 100, 99.5 }, { 99.5, 99, 98.5 } };
for (int i = 0; i < class_score.length; i++) { // 遍歷行
for (int j = 0; j < class_score[i].length; j++) {
? ? ? ? ? ? System.out.println("class_score[" + i + "][" + j + "]=" + class_score[i][j]);
}
}
}
????????上述代碼使用嵌套 for 循環(huán)語句輸出二維數(shù)組。在輸出二維數(shù)組時(shí),第一個(gè) for 循環(huán)語句表示以行進(jìn)行循環(huán),第二個(gè) for 循環(huán)語句表示以列進(jìn)行循環(huán),這樣就實(shí)現(xiàn)了獲取二維數(shù)組中每個(gè)元素的值的功能。
????????執(zhí)行上述代碼,輸出結(jié)果如下所示。
class_score[0][0]=100.0
class_score[0][1]=99.0
class_score[0][2]=99.0
class_score[1][0]=100.0
class_score[1][1]=98.0
class_score[1][2]=97.0
class_score[2][0]=100.0
class_score[2][1]=100.0
class_score[2][2]=99.5
class_score[3][0]=99.5
class_score[3][1]=99.0
class_score[3][2]=98.5
例 4
????????假設(shè)有一個(gè)矩陣為 5 行 5 列,該矩陣是由程序隨機(jī)產(chǎn)生的 10 以內(nèi)數(shù)字排列而成。下面使用二維數(shù)組來創(chuàng)建該矩陣,代碼如下:
public class Test11 {
public static void main(String[] args) {
// 創(chuàng)建一個(gè)二維矩陣
int[][] matrix = new int[5][5];
// 隨機(jī)分配值
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
? ? ? ? ? ? ? ? matrix[i][j] = (int) (Math.random() * 10);
}
}
? ? ? ? System.out.println("下面是程序生成的矩陣\n");
// 遍歷二維矩陣并輸出
for (int k = 0; k < matrix.length; k++) {
for (int g = 0; g < matrix[k].length; g++) {
? ? ? ? ? ? ? ? System.out.print(matrix[k][g] + "");
}
? ? ? ? ? ? System.out.println();
}
}
}
????????在該程序中,首先定義了一個(gè)二維數(shù)組,然后使用兩個(gè)嵌套的 for 循環(huán)向二維數(shù)組中的每個(gè)元素賦值。其中,Math.random() 方法返回的是一個(gè) double 類型的數(shù)值,數(shù)值為 0.6、0.9 等,因此乘以 10 之后為 10 以內(nèi)的整數(shù)。最后又使用了兩個(gè)嵌套的 for 循環(huán)遍歷二維數(shù)組,輸出二維數(shù)組中的值,從而產(chǎn)生矩陣。
????運(yùn)行該程序的結(jié)果如下所示。
下面是程序生成的矩陣
78148
69230
43823
75663
05688
????????for each 循環(huán)語句不能自動處理二維數(shù)組的每一個(gè)元素。它是按照行, 也就是一維數(shù)組處理的。要想訪問二維教組 a 的所有元素, 需要使用兩個(gè)嵌套的循環(huán), 如下所示:
for (double[] row : a) {
for (double value : row) {
......
}
}
把【例2】修改為使用 for each 循環(huán)語句輸出,代碼如下所示:
public static void main(String[] args) {
double[][] class_score = { { 100, 99, 99 }, { 100, 98, 97 }, { 100, 100, 99.5 }, { 99.5, 99, 98.5 } };
for (double[] row : class_score) {
for (double value : row) {
? ? ? ? ? ? System.out.println(value);
}
}
}
輸出結(jié)果為:
100.0
99.0
99.0
100.0
98.0
97.0
100.0
100.0
99.5
99.5
99.0
98.5
提示:要想快速地打印一個(gè)二維數(shù)組的數(shù)據(jù)元素列表,可以調(diào)用:
System.out.println(Arrays.deepToString(arrayName));
代碼如下:
System.out.println(Arrays.deepToString(class_score));
輸出格式為:
[[100.0, 99.0, 99.0], [100.0, 98.0, 97.0], [100.0, 100.0, 99.5], [99.5, 99.0, 98.5]]
獲取整行元素
????????除了獲取單個(gè)元素和全部元素之外,還可以單獨(dú)獲取二維數(shù)組的某一行中所有元素的值,或者二維數(shù)組中某一列元素的值。獲取指定行的元素時(shí),需要將行數(shù)固定,然后只遍歷該行中的全部列即可。
例 5
編寫一個(gè)案例,接收用戶在控制臺輸入的行數(shù),然后獲取該行中所有元素的值。代碼如下:
public static void main(String[] args) {
double[][] class_score = { { 100, 99, 99 }, { 100, 98, 97 }, { 100, 100, 99.5 }, { 99.5, 99, 98.5 } };
Scanner scan = new Scanner(System.in);
? ? System.out.println("當(dāng)前數(shù)組只有" + class_score.length + "行,您想查看第幾行的元素?請輸入:");
int number = scan.nextInt();
for (int j = 0; j < class_score[number - 1].length; j++) {
? ? ? ? System.out.println("第" + number + "行的第[" + j + "]個(gè)元素的值是:" + class_score[number - 1][j]);
}
}
執(zhí)行上述代碼進(jìn)行測試,輸出結(jié)果如下所示。
當(dāng)前數(shù)組只有4行,您想查看第幾行的元素?請輸入:
3
第3行的第[0]個(gè)元素的值是:100.0
第3行的第[1]個(gè)元素的值是:100.0
第3行的第[2]個(gè)元素的值是:99.5
獲取整列元素
????????獲取指定列的元素與獲取指定行的元素相似,保持列不變,遍歷每一行的該列即可。
例 6
編寫一個(gè)案例,接收用戶在控制臺中輸入的列數(shù),然后獲取二維數(shù)組中所有行中該列的值。代碼如下:
public static void main(String[] args) {
double[][] class_score = { { 100, 99, 99 }, { 100, 98, 97 }, { 100, 100, 99.5 }, { 99.5, 99, 98.5 } };
Scanner scan = new Scanner(System.in);
? ? System.out.println("您要獲取哪一列的值?請輸入:");
int number = scan.nextInt();
for (int i = 0; i < class_score.length; i++) {
? ? ? ? System.out.println("第 " + (i + 1) + " 行的第[" + number + "]個(gè)元素的值是" + class_score[i][number]);
}
}
執(zhí)行上述代碼進(jìn)行測試,如下所示。
您要獲取哪一列的值?請輸入:
2
第 1 行的第[2]個(gè)元素的值是99.0
第 2 行的第[2]個(gè)元素的值是97.0
第 3 行的第[2]個(gè)元素的值是99.5
第 4 行的第[2]個(gè)元素的值是98.5
更多Java學(xué)習(xí)視頻
Java基礎(chǔ):Java300集,Java必備優(yōu)質(zhì)視頻_手把手圖解學(xué)習(xí)Java,讓學(xué)習(xí)成為一種享受
Java項(xiàng)目:
【Java游戲項(xiàng)目】1小時(shí)教你用Java語言做經(jīng)典掃雷游戲_手把手教你開發(fā)游戲
【Java畢業(yè)設(shè)計(jì)】OA辦公系統(tǒng)項(xiàng)目實(shí)戰(zhàn)_OA員工管理系統(tǒng)項(xiàng)目_java開發(fā)