public class Sparse {
/**
* 稀疏数组 在一个大型矩阵中,根据坐标去找值,当一个值出现的次数过多时,那个值就是无意义的。
* 稀疏数组的存储方式(从0开始)
* 行 列 值
* [0] 第一行是总行数 第一行是总列数 第一行是总共出现的值
* [1] 1 2 36 (第一行第二列的所储存的值是36)
*/
public static void main(String[] args) {
int[][] arrays=new int[9][9];//第一个代表的是行,第二个代表的是列,就像是规定了长度
arrays[2][3]=1;//赋值,第二行第三列的值是1
arrays[3][3]=3;//赋值,第三行第三列的值是3
//输出原始的数组
System.out.println("输出原始的数组");
for(int[] ints:arrays){//第一次for循环相当于是行数
for(int anInt:ints){//第二次for循环相当于是列数
System.out.print(anInt+" ");//输出值
}
System.out.println();
}
System.out.println("=============");
//转化为稀疏数组保存
//获取有效值的个数
//判断是否有值
int sum=0;//临时变量,计数用的
for (int i=0;i<9;i++){//遍历行数
for(int j=0;j<9;j++){//遍历列数
if(arrays[i][j]!=0){//判断这个位置的坐标是不是0,不是0进入判断
sum++;//个数加1
}
}
}
System.out.println("有效值的个数"+sum);
//2.创建一个稀疏数组的数组
int[][] array2=new int[sum+1][3];//稀疏数组定义长度,动态初始化,是长度。行数因为第一行显示的是总行数,所以从第二位开始,所以要加1,第二个[]长度是3,下标就额是012
array2[0][0]=9;//第一行,总行数
array2[0][1]=9;//第一行,总列数
array2[0][2]=sum;//总共有多少个值
//遍历二维数组,将非零的值,存放稀疏数组中
int count=0;//临时数组
for(int i=0;i<arrays.length;i++){//遍历行数
for(int j=0;j<arrays[i].length;j++){//遍历列数
if(arrays[i][j]!=0){//如果行列不是0,进入判断
count++;//count+1
array2[count][0]=i;//行数
array2[count][1]=j;//列数
array2[count][2]=arrays[i][j];//arrays[i][j]代表着数组的坐标
}
}
}
System.out.println("稀疏数组");
for(int i=0;i<array2.length;i++){//正常遍历条件
System.out.println(array2[i][0]+" "+array2[i][1]+" "+array2[i][2]+" ");
}
System.out.println("======还原======");
//1.读取稀疏数组
int[][] array3=new int[array2[0][0]][array2[0][1]];//动态初始化长度,new int[][]里面就是上面已经定义好的。可以看成 int[][] array3=new int[9][9];
//2.給其中的元素还原它的值
//array2的数组是 9 9 2 这是首行,不用读取,直接从第一行开始读取所以 i=1
System.out.println(array2.length+"!!!");
for(int i=1;i<array2.length;i++){//第0行是头部信息,不用读取
//array3[][]定位,查找稀疏数组的 行 列 并将值赋給 array3[][]
array3[array2[i][0]] [array2[i][1]]= array2[i][2];
}
//3.打印数组
System.out.println("输出还原的数组");
for(int[] ints:array3){//第一次for循环相当于是行数
for(int anInt:ints){//第二次for循环相当于是列数
System.out.print(anInt+" ");//输出值
}
System.out.println();
}
System.out.println("=============");
}
}