1. 程式人生 > >Java開發筆記(二十一)二維陣列的擴充套件

Java開發筆記(二十一)二維陣列的擴充套件

前面介紹的陣列容納的是一串數字,彷彿一根線把這組數字串了起來,故而它只是一維陣列。一維陣列用來表示簡單的數列尚可,要是表達複雜的平面座標系,那就力不從心了。由於平面座標系存在水平和垂直兩個方向,因此可用二維陣列來儲存平面座標系上的一組座標頂點,其中第一維是頂點佇列,第二維是頂點的橫縱座標。許多個平面組合起來變成一幅動畫,每個平面都構成動畫的一個幀,這樣就形成了三維陣列。二維陣列、三維陣列,乃至更多維度的陣列,統稱為多維陣列。多維陣列全由一維陣列擴充套件而來,它們的用法大同小異,因而只要學會如何使用二維陣列,即可舉一反三運用其他多維陣列。下面就以二維陣列為例,統一介紹多維陣列的常見用法。
如同一維陣列那樣,二維陣列也有兩種宣告形式,一種是在變數名稱後面新增兩對方括號,例如“double triangle[][]”;另一種是在型別後面新增兩對方括號,例如“int[][] triangle”。前述的二維陣列triangle表示平面座標系上的三角形,其中第一對方括號表示這個三角形有幾個頂點,第二對方括號表示每個頂點由幾個座標方向構成。
給二維陣列分配儲存空間也有三種方式,分別說明如下:
1、利用語句“new 變數型別[頂點數量][方向數量]”分配空間,比如三角形triangle有三個頂點,每個頂點由橫縱兩個座標方向組成,則可通過下面這行語句實現:

		// 在兩對方括號內分別填入數字,表示陣列有多少行多少列
		triangle = new double[3][2];

 

2、在分配儲存空間的時候立即對陣列進行初始化賦值,此時方括號中間不填數字,而在方括號後面新增花括號,並且花括號內部是以逗號分隔的幾個一維陣列。此時初始化賦值的程式碼如下所示:

		// 方括號內留空,然後緊跟花括號,花括號內部是以逗號分隔的幾個一維陣列
		double[][] triangle = new double[][]{
				new double[]{-2.0, 0.0},
				new double[]{0.0, -1.0},
				new double[]{2.0, 1.0}
		};

 

3、可見上面的第二種寫法實在囉嗦,完全可以參照一維陣列的簡化寫法,把多餘的“new double***”統統去掉,於是整個初始化程式碼精簡如下:

		// 賦值等號右邊直接跟著花括號,花括號又內嵌好幾個花括號分別表示對應的一維陣列
		double[][] triangle = { {-2.0, 0.0}, {0.0, -1.0}, {2.0, 1.0} };

以上的賦值等號右邊直接跟著花括號,花括號裡面又有三組花括號,每組花括號分別容納兩個數字。這便告訴編譯器:該二維陣列需要分配三個頂點,並且每個頂點都有兩個座標方向。

若要獲取二維數組裡面的某個元素,可採取“陣列名稱[元素行號][元素列號]”的形式,表示當前操作的是第幾行第幾列的陣列元素。與一維陣列不同的是,對於二維陣列來說,“陣列名稱.length”不能獲得所有元素的數量,而是獲得該陣列的行數;要想獲取某行的列數,則需通過“triangle[行號].length”來得到,把所有行的列數累加起來,才能求得該二維陣列的元素個數。下面是宣告一個浮點型的二維陣列,並對每個陣列元素賦值,最後遍歷列印各元素的完整程式碼例子:

		// 以下是宣告二維陣列的第一種形式:“變數型別 陣列名稱[][]”
		double triangle[][];
		// 以下是分配二維陣列空間的第一種形式
		// 在兩對方括號內分別填入數字,表示陣列有多少行多少列
		triangle = new double[3][2];
		// 陣列名稱後面的“[數字1][數字2]”,就是陣列元素的行列下標,表示當前操作的是第幾行第幾列的陣列元素
		triangle[0][0] = -2.0;
		triangle[0][1] = 0.0;
		triangle[1][0] = 0.0;
		triangle[1][1] = -1.0;
		triangle[2][0] = 2.0;
		triangle[2][1] = 1.0;
		// 下面通過迴圈語句依次讀出陣列中的所有元素。
		// “二維陣列名稱.length”表示獲取該陣列的行數
		for (int i=0; i<triangle.length; i++) {
			// “triangle[i].length”表示獲取該陣列第i行的列數
			for (int j=0; j<triangle[i].length; j++) {
				// 列印第i行第j列的陣列元素
				System.out.println("triangle["+i+"]["+j+"]="+triangle[i][j]);
			}
		}

 

上述示例程式碼中的二維陣列,存放了平面座標系上的三個頂點,它們的座標分別是(-2.0, 0.0)、(0.0, -1.0)、(2.0, 1.0)。這三個座標點構成了一個三角形的三個頂點,正如下圖所示的A點(座標為(-2,0))、B點(座標為(0,-1))、C點(座標為(2,1))。

看到了熟悉的平面座標圖,這下平面幾何的知識可派上用場了,例如根據兩點的座標來計算兩點之間的距離。既然三角形有三個頂點A、B、C,接下來不妨計算它的三條邊長,包括AB、AC和BC三條邊的長度。於是分別求得兩個頂點在橫軸方向的距離,以及在縱軸方向的距離,然後利用勾股定理算出連線兩頂點的斜邊長度。以下便是由二維陣列儲存的座標數值求解三角形各邊長的演示程式碼:

		// 下面通過迴圈語句依次計算三角形每條邊的長度
		// 假設第一個陣列元素代表點A,第二個陣列元素代表點B,第三個陣列元素代表點C,
		// 則本迴圈將依次求得AB、AC、BC這三條邊的長度
		for (int i=0; i<triangle.length-1; i++) {
			for (int j=i+1; j<triangle.length; j++) {
				// 獲取兩個頂點在橫軸方向的距離
				double xDistance = Math.abs(triangle[j][0] - triangle[i][0]);
				// 獲取兩個頂點在縱軸方向的距離
				double yDistance = Math.abs(triangle[j][1] - triangle[i][1]);
				// 根據勾股定理計算連線兩頂點的斜邊長度
				double distance = Math.sqrt(xDistance*xDistance + yDistance*yDistance);
				System.out.println("i="+i+",j="+j+",distance="+distance);
			}
		}

 

執行上述的演示程式碼,打印出來的三角形邊長計算結果如下所示:

i=0,j=1,distance=2.23606797749979
i=0,j=2,distance=4.123105625617661
i=1,j=2,distance=2.8284271247461903