概念:
所谓稀疏数组就是当数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以使用稀疏数组去压缩数据
主要就是为了节省那些为零的值初始化了不用的内存,我们在来看一个图
可以很明显的可以看到里面有很多空(0)值,这些值实际上是没有用到的
哪买稀疏数组长什么样呢,我们在来看个图:
从这个图我们大概可以看出一个大概意思,二维数组(从原来的6行7列,变成了9行,3列)不过不要急,下面有详细的代码实践帮助理解,
// 1表示黑子,2 表示蓝子 0 表示空值
int[][] charArr = new int[11][11];
/*模拟二维黑白子的二维数组如下*/
charArr[1][2]=1;
charArr[2][3]=2;
charArr[4][5]=2;
System.out.println("原始测试二维数组如下:");
//输出原始的二维数组
for(int [] row : charArr){
for (int data : row){
System.out.printf("%d\t",data);
}
System.out.println();
}
System.out.println();
int sum = 0 ;
//二维数组转稀疏数组
for(int i = 0 ; i < 11 ; i ++){
for(int j = 0 ; j < 11 ; j ++){
if (charArr[i][j] != 0){
sum++;
}
}
}
System.out.printf("原始数组有效元素sum=%d\n",sum);
System.out.println();
System.out.println("转换后的稀疏数组如下:");
//创建稀疏数组
int[][] charArr1 = new int[sum + 1][3];
charArr1[0][0] =11; // 行
charArr1[0][1] =11; // 列
charArr1[0][2] =sum; // 值
//二维数组转稀疏数组
int count = 0;
for(int i = 0 ; i < 11 ; i ++){
for(int j = 0 ; j < 11 ; j ++){
if (charArr[i][j] != 0){
count++;
charArr1[count][0] = i;//行
charArr1[count][1] = j; // 列
charArr1[count][2] = charArr[i][j];
}
}
}
//得到的稀疏数组形式
for(int i = 0 ; i < charArr1.length ; i ++ ){
System.out.printf("%d\t%d\t%d\t\n",charArr1[i][0],charArr1[i][1],charArr1[i][2]);
}
System.out.println();
System.out.println("还原的二维数组如下:");
// 将稀疏数组转二维数组
int[][] charArr2 = new int[charArr1[0][0]][charArr1[0][1]];//第一行数据保存的数组大小初始化要转的二维数组
// 读取稀疏数组的后几行数据赋值给稀疏数组(从第二行开始)
for(int i = 1; i < charArr1.length ; i ++ ){//开始读取每行内容
charArr2[charArr1[i][0]/*初始化行*/][charArr1[i][1]/*初始化列*/]=charArr1[i][2]/*初始化值*/;//稀疏数组的行,列,值都对应二维数组中的行列值
}
//恢复后的二维数组
for(int [] row : charArr2){
for (int data : row){/*打印二维数组的每一列数据*/
System.out.printf("%d\t",data);
}
System.out.println();
}
运行结果如下: