搞清楚稀疏數(shù)組之前,先得知道什么是二維數(shù)組
二維數(shù)組
二維數(shù)組相當(dāng)于一維數(shù)組里面存了些一維數(shù)組
int[] a={1,2};
int[] b={3,4};
int[][] ab={a,b}; //里面放a,b數(shù)組

內(nèi)存中位置.png
稀疏數(shù)組

稀疏數(shù)組.png
可以看到圖中 只有幾個是有效數(shù)字 其他是無效的,很占空間
所以我們可以通過壓縮的方式,將數(shù)組變小
具體規(guī)則:
- 首行: 這個數(shù)組有 幾行幾列 幾個有效值(不為0都是有效值)
- 其他行: 第幾行 第幾列 有效數(shù)字是多少
| 行 | 列 | 值 |
|---|---|---|
| 7 | 8 | 3 |
| 3 | 5 | 1 |
| 4 | 5 | 2 |
| 6 | 8 | 4 |
PS:有些博客第一行第一列會寫成 0,0
eg.上面的第三行第五列
| 3 | 5 | 1 |
|---|
會寫成 對應(yīng)數(shù)組下標(biāo)的方式
| 2 | 4 | 1 |
|---|
個人覺得我這樣方便閱讀一點
上代碼:
-
壓縮
//array[x][y]
public int[][] compressArray(int array[][]){
//記錄有幾個有效數(shù)字
int sum=0;
for (int i = 0; i <array.length ; i++) { //有多少行 x
for (int j = 0; j <array[0].length ; j++) { //有多少列 y 隨便算哪行的長度array【i】.lenth 因為列是固定
if(array[i][j]!=0){
sum++;
}
}
}
//初始化壓縮后的數(shù)組 sum+1是因為首行要放幾行幾列等有效數(shù)據(jù)
int[][] endArray=new int[sum+1][3];
//首行信息
endArray[0][0]=array.length;
endArray[0][1]=array[0].length;
endArray[0][2]=sum;
int count=1; //標(biāo)記給哪行賦值 從第二行開始
//給壓縮后的數(shù)組賦值
for (int i = 0; i <array.length ; i++) {
for (int j = 0; j <array[0].length ; j++) {
if(array[i][j]!=0){
endArray[count][0]=i+1; //因為數(shù)組是從0開始 而我們一般從第一行開始,所以這里+1 方便閱讀
endArray[count][1]=j+1;
endArray[count][2]=array[i][j];
count++;
}
}
}
return endArray;
}
-
解壓
public int[][] unCompressArray(int[][] array){
//初始化壓縮后的數(shù)組
int x=array[0][0]; //行
int y=array[0][1];//列
int[][] endArray=new int[x][y];
//從1開始遍歷 因為0是首部信息
for (int i = 1; i <array.length ; i++) {
int x2=array[i][0]-1; //行號 不過要減一 因為之前為了閱讀方便加了1
int y2=array[i][1]-1; //列號 不過要減一 因為之前為了閱讀方便加了1
int num2=array[i][2];
endArray[x2][y2]=num2;
}
return endArray;
}
-
打印
//打印數(shù)組
public void printArray(int[][] array){
for (int[] ax: array) {
for (int x:ax) {
System.out.print(x+"\t");
}
System.out.println();
}
}
最終結(jié)果:

image.png
應(yīng)用場景
對重點數(shù)據(jù)進行記錄
圍棋:表示黑子或白子(表示子較少的比較好)
地圖:在一個坐標(biāo)系中 表示出哪家商戶 xy坐標(biāo)是多少
*有錯誤歡迎大家指出*