public class SparseArrayTest {
public static void main(String[] args) {
//创建一个充斥大量无效数据的二维数组,10行10列(前一个中括号表示行,后一个中括号表示列)
int[][] array1=new int[10][10];
//定义几个有效数据
array1[3][3]=77;
array1[4][4]=66;
array1[5][3]=55;
array1[6][2]=44;
int count=0;//用于计算有效数据的个数
//遍历二维数组
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if(array1[i][j]!=0){//当第i行第j列的数据不是0的时候,既表示其为有效数据
count++;
}
System.out.print(array1[i][j]+" ");//将二维数组里的第一个数组,即第一行打印出来,包括无效数据
}
System.out.println();//每打印一行换一次行
}
/*-------------------------------------------------------------------------------------
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 77 0 0 0 0 0 0
0 0 0 0 66 0 0 0 0 0
0 0 0 55 0 0 0 0 0 0
0 0 44 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
-----------------------------------------------------------------------------------------*/
System.out.println("稀疏数组中有效值的个数是:"+count);//打印出count值
System.out.println("--------------------------------------------------------------");//美丽分界线
/*
创建一个稀疏数组,也是一个二维数组;
其中其固定三列,也就是二维数组中的每一个单数组只有三个元素;
行数为有效数据的个数count+1;
原数组中每一个有效数据都是一个数组;
*/
int[][] sparseArray=new int[count+1][3];
/*稀疏数组:
10 10 4
3 3 77
4 4 66
5 3 55
6 2 44
*/
/*
稀疏数组的第一行表示的是原数组的总体概况:
第一列表示原数组共有几行;
第二列表示原数组共有几列;
第三列表示原数组共有几个有效数据;
*/
sparseArray[0][0]=10;//第一行第一列
sparseArray[0][1]=10;//第一行第二列
sparseArray[0][2]=count;//第一行第三列
int count1=0;//用于指向稀疏数组的行
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if(array1[i][j]!=0){
count1++;//从稀疏数组的第一行开始添加数据
sparseArray[count1][0]=i;//稀疏数组的每一行的第一列为原数组有效数据所在的行
sparseArray[count1][1]=j;//稀疏数组的每一行的第二列为原数组有效数据所在的列
sparseArray[count1][2]=array1[i][j];//稀疏数组的每一行的第三列为原数组有效数据的具体值
}
}
}
//打印稀疏数组
for (int i = 0; i < sparseArray.length; i++) {
System.out.println(sparseArray[i][0]+" "+sparseArray[i][1]+" "+sparseArray[i][2]);
}
//稀疏数组复原
/*
创建一个新的二维数组,其中:
新数组的行数是稀疏数组的第一行第一列的值;
新数组的列数是稀疏数组的第一行第二列的值;
*/
int[][] array2=new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i = 1; i < sparseArray.length; i++) {//遍历稀疏数组,从第二行也就是索引1开始
/*
把有效数据赋值到原数组的对应的具体元素上:
从第二行开始:
稀疏数组的每一行的第一列为原数据的所在行;
稀疏数组的每一行的第二列为原数据的所在列;
稀疏数组的每一行的第三列为原数据的值
*/
array2[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
}
//打印复原数组
for(int[] row:array2){
for (int v:row){
System.out.print(v+" ");
}
System.out.println();
}
}
}