目录
稀疏数组
将大量的零消去(压缩)
第一个元素来存放原始的数组一共有几行 几列 总共有多少值
之后的元素来存放 每个有效元素所在的行 列 自身值
如图,将11乘11 的数组转换成 3乘3
从0开始算
1是1行2列
2是2行3列
思路
二维数组转稀疏数组:
-
遍历原始的二维数组,得到要保存的有效数据的个数sum
-
根据sum可以创建稀疏数组,sparseArr int[sum+1] [3] 每一个有效数在稀疏数组中独占一行
-
注意:稀疏数组的列是可以确定的只能有3列,这里的行是比得到的有效数的个数还要多一个(还要加上第一行)
-
将二维数组的有效数据存入到稀疏数组中
稀疏数组转二维数组:
-
先读取稀疏数组的第一行得到原来数组的行和列,创建原始的二维数组
-
在读取稀疏数组后几行的数据,并赋给原始的二维数组
实现
变为稀疏数组
/**
* 变成稀疏数组
*/
//1.创建数组
int [][]Arraylists= new int[11][11];
//2.随机给数组赋值
Arraylists[1][2] = 1;
Arraylists[2][3] = 2;
Arraylists[5][6] =2;
//3.输出原数组
for(int[] line : Arraylists){
for(int data :line){
System.out.print(" "+data);
}
System.out.println();
}
//4.统计元素的总数
int sum = 0;
for(int[] line : Arraylists){//二维数组的每一行可以看成是一维数组
for(int data :line) {//输出每行的元素
if(data!=0){
sum++;//统计不为零的元素个数
}
}
}
//5.创建稀疏数组
int [][]sparseArr = new int[sum+1][3];
//列数永远为3,行会比元素个数多一个,因为第一行是统计总数的,
//而每个元素又单独占一行
sparseArr[0][0]=11;//有多少行
sparseArr[0][1]=11;//有多少列
sparseArr[0][2]=sum;//总的元素个数
//6.给稀疏数组赋值(难点)
int counts =0;//代表某一行
for(int i = 0; i<11;i++){
for(int j = 0;j<11;j++){
if(Arraylists[i][j]!=0){ //如果不是零把该元素放入稀疏数组
/*有值的时候就给稀疏数组加一行,所以实现行的自增*/
counts++;//行自增(从第一行开始,第零行位置已近被占了)
sparseArr[counts][0]=i;//自增行的第一个元素是i(保存元素的行)
sparseArr[counts][1]=j;//自增行的第二个元素的列(保存元素的列)
sparseArr[counts][2]=Arraylists[i][j];//自增行的第三个是该元素本身
}
}
}
//7.遍历输出稀疏数组
for(int[] line :sparseArr){
for(int data :line){
System.out.print(" "+data);
}
System.out.println();
}
稀疏数组返回
/**
* 稀疏数组变回来
*/
//1.先读取稀疏数组第一行(因为第一行里放着元数组的行、列、以及不为零的数的和)
int lineAll = sparseArr[0][0];//行
int colAll = sparseArr[0][1];//列
int [][]arr_plus=new int[lineAll][colAll];//创建要盛放元数组的数组
/*注意:二位数组.length是行数*/
//2.将每一行有的值
//(第2列表示该元素,第0列表示该元素所在的行,第1列表示该元素所在的列)
//传给新数组
for(int i = 1;i<sparseArr.length;i++){
//输出每一行,是从第二行(下标是1)开始,第一行存的是总数
arr_plus[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
//下标对应元素
}
//3.遍历输出
for(int[] line : arr_plus){
for(int data :line){
System.out.print(" "+data);
}
System.out.println();
}