稀疏数组的应用场景:当二维数组中有大量重复数字(以0为例)时,可以用稀疏数组进行保存,节省保存空间。
稀疏数组有三列n行
第一行用来记录原二维数组信息,第一列用来记录原二维数组的行数,第二列用来记录二维数组的列数,第三列用来记录二维数组中非0个数。
其他行用来记录非0元素的信息,第一列记录其在原二维数组中的行标,第二列记录列标,第三列用来记录其具体的值。
可见稀疏数组的行数 n=二维数组非0元素的个数+1;
代码练习:
public class SparseArray { public static void main(String[] args) { //稀疏数组棋牌案例(0表示空格,1表示黑子,2表示白子) //创建一个原始棋牌 int chesArr[][]= new int[11][11]; chesArr[2][3] = 2; chesArr[5][6] = 1; int sum=0;//用来记录非0的个数 for(int i=0;i<chesArr.length;i++){ for(int j=0;j<chesArr[i].length;j++){ if(chesArr[i][j] !=0) sum++; } } int[][] sparseArray = new int[sum+1][3]; //第一行用来记录原二维数组的行和列,剩余的行用来记录非0数据的位置和值 sparseArray[0][0] = 11; sparseArray[0][1] = 11; sparseArray[0][2] = sum; int count=1; for(int i=0;i<chesArr.length;i++){ for(int j=0;j<chesArr[i].length;j++){ if(chesArr[i][j] !=0){ sparseArray[count][0]=i;//第一行用来记录元二维数组的非0数据的行 sparseArray[count][1]=j;//第二行用来记录元二维数组的非0数据的列 sparseArray[count][2] = chesArr[i][j];//第三行用来记录元二维数组的非0数据的值 count++; } } } //还原数组 int[][] chesArr2 = new int[sparseArray[0][0]][sparseArray[0][1]]; for(int i=1;i<sparseArray.length;i++){ int row=sparseArray[i][0]; int line=sparseArray[i][1]; chesArr2[row][line]=sparseArray[i][2]; } //遍历 for(int[] row : chesArr2){ for(int data : row){ System.out.print(" "+data); } System.out.println(); } } }