Java稀疏数组
稀疏数组是一种记录有效数字,省略重复无效的数字的一种数组记录方式
这个二维数组中,记录了大量的无效数组元素,占用了大量内存空间,那么怎么解决这个问题呢?就需要稀疏数组。
稀疏数组建减少了大量无用数据,记录了原本数组的行列,有效值个数,每个数组元素的下标和值。
稀疏数组的列是固定的3列,行是有效值个数+1。
public class Day1{
public static void main(String[] args){
//1.创建一个普通数组
int [][] array=new int[6][7];
//2.为数组有值部分赋值
array[0][3]=22;
array[0][6]=15;
array[1][1]=11;
array[1][5]=17;
array[2][3]=-6;
array[3][5]=39;
array[4][0]=91;
array[5][2]=28;
//3.通过双重for循环输出这个数组
for(int i=0; i<array.length; i++){
for(int j=0; j<array[i].length; j++){
System.out.print(array[i][j]+"\t");
}
System.out.println();//输出效果为第一幅图片
}
}
}
转化为稀疏数组
//1.创建一个稀疏数组,由于创建一个稀疏数组必须知道数组的有效值 为多少,所以我们先求出数组的有效值
//int[][] array1=new int[][];
System.out.print("行\t列\t值\n");
int sum=0;
for(int i=0; i<6; i++){
for(int j=0; j<7; j++){//第一种遍历方式
if(array[i][j]!=0){
sum++;
}
}
}
//2.知道了有效数值,我们来创建一个稀疏数组
int [][] array1=new int[sum+1][3];
//3.记录普通数组的行,列,有效值,就是稀疏数组的第一行
array1[0][0]=6;
array1[0][1]=7;
array1[0][2]=sum;
//4.遍历普通数组,将非0的数存在稀疏数组中
int num=0;
for(int i=0; i<array.length; i++){
for(int j=0; j<array[i].length;j++){//第二种遍历方式。两个for循环,第一个for循环遍历行数i(array.length),第二个for循环遍历列数j(array[i].length)
if(array[i][j]!=0){
num++;
array1[num][0]=i;
array1[num][1]=j;
array1[num][2]=array[i][j];
}
}
}
//5.输出这个数组
for(int i=0; i<array1.length;i++){
for(int j=0; j<3;j++){
System.out.print(array1[i][j]+"\t");
}
System.out.println();//效果为第二幅图片
}
易犯错误:
- 粗心导致把 j 写成 i
- 把array[i]当成一个值
//把稀疏数组还原为普通数组
//1.创建一个普遍数组,把稀疏数组的行列赋给普通数组
int [][] array2=new int[array1[0][0]][array1[0][1]];
//2.遍历稀疏数组,把有效值赋给这个普通数组的坐标
for(int i=1; i<array1.length; i++){//这里i等于1,因为不需要从第一行开始
array2[array1[i][0]][array1[i][1]]=array1[i][2];
}
//3.输出这个数组
for(int i=0; i<array2.length; i++){
for(int j=0; j<array[i].length; j++){
System.out.print(array[i][j]+"\t");
}
System.out.println();
}