官术网_书友最值得收藏!

5.4 多維數(shù)組

雖然一維數(shù)組可以處理一般簡單的數(shù)據(jù),但是在實際的應用中仍顯不足,所以Java語言提供了多維數(shù)組,但在Java語言中并沒有真正的多維數(shù)組。所謂多維數(shù)組,就是數(shù)組元素也是數(shù)組的數(shù)組。

5.4.1 二維數(shù)組

二維數(shù)組的聲明方式與一維數(shù)組類似,內(nèi)存的分配也一樣是用new運算符。其聲明與分配內(nèi)存的格式如下所示:

     數(shù)據(jù)類型[][]數(shù)組名;
     數(shù)組名=new數(shù)據(jù)類型[行數(shù)][列數(shù)];

二維數(shù)組在分配內(nèi)存時,要告訴編譯器二維數(shù)組行與列的個數(shù)。因此在上面格式中,“行數(shù)”是告訴編譯器所聲明的數(shù)組有多少行,“列數(shù)”則是聲明每行中有多少列。例如:

     int[][]a;    //聲明二維整型數(shù)組a
     a=new int[3][4]; //分配一塊內(nèi)存空間,供3行4列的整型數(shù)組a使用

同樣地,也可以用較為簡潔的方式來聲明數(shù)組,其格式如下:

     數(shù)據(jù)類型[][]數(shù)組名=new數(shù)據(jù)類型[行數(shù)][列數(shù)];

以該種方式聲明的數(shù)組,在聲明的同時,就分配一塊內(nèi)存空間,供該數(shù)組使用。如

     int[][]a=new int[3][4];

雖然在應用上很像C語言中的多維數(shù)組,但還是有區(qū)別的,在C語言中定義一個二維數(shù)組,必須是一個m×n的矩形,如圖5.4所示。Java語言的二維數(shù)組不一定是規(guī)則的矩形,如圖5.5所示。

圖5.4 C語言中二維數(shù)組必須是矩形

圖5.5 Java語言中的二維數(shù)組不一定是矩形

如,定義一個如下的數(shù)組:

     int[][]x=nex int[];

它表示定義了一個數(shù)組引用變量x,第一個元素為x[0],第n個元素變量為x[n—1]。x中從x[0]到x[n—1]的每個元素變量正好又是一個整數(shù)類型的數(shù)組引用變量。需要注意的是,這里只是要求每個元素都是一個數(shù)組引用變量,并沒有要求它們所引用數(shù)組的長度是多少,也就是每個引用數(shù)組的長度可以不一樣。例如:

     int[][]x;
     x=new int[3][];

這兩行代碼表示數(shù)組x有三個元素,每個元素都是int[]類型的一維數(shù)組。該語句相當于定義了三個數(shù)組引用變量,分別是int[]x[0],int[]x[1]和int[]x[2],完全可以把x[0]、x[1]和x[2]當成普通變量名來理解。

由于x[0]、x[1]和x[2]都是數(shù)組引用變量,因此,必須對它們賦值,指向真正的數(shù)組對象,才可以引用這些數(shù)組中的元素。例如:

     x[0]=new int[3];
     x[1]=new int[2];

由此可以看出,x[0]和x[1]的長度可以是不一樣的,數(shù)組對象中也可以只有一個元素。程序運行到這之后的內(nèi)存分配情況如圖5.6所示。

圖5.6 Java中的二維數(shù)組可以看成是多個一維數(shù)組

x[0]中的第二個元素用x[0][1]來表示,如果要將整數(shù)100賦給x[0]中的第二個元素,寫法如下:

     x[0][1]=100;

如果數(shù)組對象正好是一個m×n形式的規(guī)則矩陣,可不必向上面代碼一樣,先創(chuàng)建高維的數(shù)組對象后,再逐一創(chuàng)建低維的數(shù)組對象。完全可以用一條語句在創(chuàng)建高維數(shù)組對象的同時,創(chuàng)建所有的低維數(shù)組對象。例如:

     int[][]x=new int[2][3];

該語句表示創(chuàng)建了一個2×3形式的二維數(shù)組,其內(nèi)存布局如圖5.7所示。

圖5.7 規(guī)則的二維數(shù)組內(nèi)存分配

在二維數(shù)組中,若要取得二維數(shù)組的行數(shù),只要在數(shù)組名后加上.length屬性即可;若要取得數(shù)組中某行元素的個數(shù),則須在數(shù)組名后加上該行的下標,再加上.length。例如:

     x.length;    //計算數(shù)組x的行數(shù)
     x[0].length;     //計算數(shù)組x的第1行元素的個數(shù)
     x[2].length;     //計算數(shù)組x的第3行元素的個數(shù)

注意與一維數(shù)組相同,用new運算符來為數(shù)組申請內(nèi)存空間時,很容易在數(shù)組各維數(shù)的指定中出現(xiàn)錯誤,二維數(shù)組要求必須指定高層維數(shù)。例如,下面是正確的申請方式:

下面是錯誤的申請方式:

如果想直接在聲明二維數(shù)組時就給數(shù)組賦初值,可以利用花括號實現(xiàn),只要在數(shù)組的聲明格式后面再加上初值的賦值即可。其格式如下:

同樣需要注意的是,用戶并不需要定義數(shù)組的長度,因此在數(shù)據(jù)類型后面的方括號里并不必填寫任何的內(nèi)容。此外,在花括號內(nèi)還有幾組花括號,每組花括號內(nèi)的初值會依次賦值給數(shù)組的第1,2,…,n+1行元素。例如:

該語句中聲明了一個整型數(shù)組a,該數(shù)組有2行4列共8個元素,花括號里的兩組初值會分別依次指定給各行里的元素存放,a[0][0]為11,a[0][1]為22,…,a[1][3]為99。

注意與一維數(shù)組一樣,在聲明多維數(shù)組并初始化時不能指定其長度,否則出錯。如“int[2][3]b={{1,2,3},{4,5,6}};”語句在編譯時將出錯。

例5.4】 計算并輸出楊輝三角形。

該程序的運行結(jié)果為:

該程序的第8行聲明了一個7行的二維數(shù)組iaYong,每行的列數(shù)由第10、11行的for循環(huán)來定義;第13~19行的for循環(huán)用于計算楊輝三角形并存入數(shù)組iaYong的相應元素中,其中的第15、18行分別是將第i行的第一個元素和最后一個元素置1;第16行定義的內(nèi)層for循環(huán)用于計算第i行的其他元素,其計算方法是第17行的循環(huán)體;第20~25行利用foreach循環(huán)將楊輝三角形輸出。

5.4.2 三維以上的多維數(shù)組

通過對二維數(shù)組的介紹,不難發(fā)現(xiàn),要想提高數(shù)組的維數(shù),只要在聲明數(shù)組的時候?qū)⑾聵伺c中括號再加一組即可,所以三維數(shù)組的聲明為“int[][][]a;”,而四維數(shù)組為“int[][][][]a;”,依次類推。

使用多維數(shù)組時,輸入輸出的方式和一、二維數(shù)組相同,但是每多一維,嵌套循環(huán)的層數(shù)就必須多一層,所以維數(shù)越高的數(shù)組其復雜度也就越高。

例5.5】 聲明三維數(shù)組并賦初值,然后輸出該數(shù)組的各元素,并計算各元素之和。

程序運行時的結(jié)果如下:

     a[0][0][0]=1
     a[0][0][1]=2
     a[0][1][0]=3
     a[0][1][1]=4
     a[1][0][0]=5
     a[1][0][1]=6
     a[1][1][0]=7
     a[1][1][1]=8
     sum=36

該程序利用三層循環(huán)來輸出三維數(shù)組的各元素并計算各元素之和。

主站蜘蛛池模板: 兴隆县| 中西区| 滁州市| 梓潼县| 东方市| 通化市| 淳安县| 呼伦贝尔市| 庆云县| 外汇| 洛扎县| 稻城县| 邹城市| 都江堰市| 富顺县| 平昌县| 扶绥县| 铁岭市| 扶风县| 得荣县| 如皋市| 班戈县| 上高县| 英吉沙县| 博野县| 仁化县| 东丽区| 安仁县| 庆城县| 朔州市| 德惠市| 长春市| 宁晋县| 邢台县| 永宁县| 高雄市| 峡江县| 宜都市| 常宁市| 兴隆县| 阿克陶县|