当一个数组只存了几个值的时候,就会浪费大量的空间。这时候如果用另外一个数组来记录当前数组中的有效值,并且它所在的位置,这样新生成的数组会比原来的数组小很多,这个新生成的数组就是稀疏数组
规则:
- 稀疏数组的第0行第0个元素记录原始数组的行号,第0行第1个元素记录原始数组的列号,第0行第2个元素记录原始数组的有效值
- 第i行第0个元素存放有效值的行号
- 第i行第1个元素存放有效值的列号
- 第i行第2个元素存放有效值
如下图:左边就是原始数组,右边就是稀疏数组
public class Demo07 {
public static void main(String[] args) {
int[][] array1 =new int[11][11];
array1[1][2]=1;
array1[2][3]=2;
System.out.println("输出原始数组:");
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt+" ");
}
System.out.println();
}
System.out.println("========");
//转为稀疏数组保存
//获取有效值的个数
int sum=0; //记录有效值的个数
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if(array1[i][j]!=0){
sum++;
}
}
}
//创建一个稀疏数组的数组 sum+1 表示有多少个有效值
int[][] array2=new int[sum+1][3];
//创建稀疏数组的表头
array2[0][0]=11;
array2[0][1]=11;
array2[0][2]=sum;
//遍历二维数组,将非0的值存放在稀疏数组中
int count =0;//计数的作用
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if(array1[i][j]!=0){
count++;
array2[count][0]=i; //记录二维数组中有效值的行号
array2[count][1]=j; //记录二维数组中有效值的列号
array2[count][2]=array1[i][j]; //记录二维数组中的有效值
}
}
}
//输出稀疏数组
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i][0]+"\t"+array2[i][1]+"\t"+array2[i][2]);
}
System.out.println("==========");
//还原:
int[][] array3 =new int[array2[0][0]][array2[0][1]];
//给array2中的元素还原它的值 从第1行开始,因为第0行是记录了array1的行号,列号,有效值
for (int i = 1; i < array2.length; i++) {
array3[array2[i][0]][array2[i][1]] =array2[i][2];
}
//打印
for (int[] ints : array3) {
for (int anInt : ints) {
System.out.print(anInt+" ");
}
System.out.println();
}
}
}