稀疏數組
當一個數組中大部分元素爲0(null),或者爲同一個值的數組時,可以使用稀疏數組來保存該數組。
稀疏數組的處理方法是:
1.記錄數組一共幾行幾列,有多少個不同的值
2.把具有不同值得元素的行列及值記錄在一個小規模的數組中,從而縮小程序的規模
如圖數據大概左面這樣,右邊爲稀疏數組記入的值,如果用以前的數組記入就會有10(行)X9(列)=90個元數據,但是用稀疏數組就是2(行)X3(列)=6個元數據,大大節省了空間(前提是數據有很多重複的值,甚至就是空或者沒有值)
二位數組 轉 稀疏數組的思路
1.遍歷 原始的二位數組,得到有效數據的個數sum
2.根據sum就可以創建稀疏數組sparseArr int[sum+1][3]
3.將二維數組的有效數據存入稀疏數組
稀疏數組 轉 二維數組的思路
1.先讀取稀疏數組的第一行,根據第一行的數據創建原始的二位數組,chessArr2=int[9][10]
2.在讀取稀疏數組後幾行的數據,並賦予原始的二維數組即可
代碼實現
public static void main(String[] args) { // 先創建一個原始的二維數組 9*10 // 0:表示沒有值,*:表示值爲* int chessArr1[][] = new int[9][10]; chessArr1[1][1] = 1; chessArr1[2][2] = 2; // 輸出原始的二維數組 System.out.println("原始的二維數組"); for (int[] row : chessArr1) { for (int data : row) { System.out.printf("%d\t", data); } System.out.println(); } // 將二位數組轉爲稀疏數組 // 1.先遍歷二維數組 得到非0的值 int sum = 0; for (int i = 0; i < chessArr1.length; i++) { for (int j = 0; j < chessArr1[0].length; j++) { if (chessArr1[i][j] != 0) { sum++; } } } // System.out.println(sum); // 2 // 創建對應的稀疏數組 int sparseArr[][] = new int[sum + 1][3]; // 2.給稀疏數組賦值 sparseArr[0][0] = 9; // 數據一共幾行 sparseArr[0][1] = 10; // 數據一共幾列 sparseArr[0][2] = sum; // 一共有多少個非0的值 // 3.遍歷二維數組 將非0的值存放到 sparseArr中 int count = 0; // 用於記入是第幾個非 0 數據 for (int i = 0; i < chessArr1.length; i++) { for (int j = 0; j < chessArr1[0].length; j++) { if (chessArr1[i][j] != 0) { count++; sparseArr[count][0] = i; sparseArr[count][1] = i; sparseArr[count][2] = i; } } } // 輸出稀疏數組的形式 System.out.println("得到的稀疏數組維~~~~~"); for (int i = 0; i < sparseArr.length; i++) { System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]); } // 稀疏數組 轉 二維數組 // 1.先讀取稀疏數組的第一行,根據第一行的數據,創建原始的二維數組 int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]]; // 2.讀取稀疏數組後幾行數據(從第二行開始),並賦予原始的二維數據 for (int i = 1; i < sparseArr.length; i++) { chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2]; } // 輸出恢復後的二維數組 System.out.println("恢復後的二維數組"); for (int[] row : chessArr2) { for (int data : row) { System.out.printf("%d\t",data); } System.out.println(); } }