稀疏数组怎么来的
如上图所示左边是原数组,右边是稀疏数组,为了简化原数组,去掉重复无效的0,则简化为右边稀疏数组
左边总共6行7列,有效数字只有8个(其余全是0为无效)
则构成了稀疏数组第一行 6,7,8
从第二行开始记录每个有效数字,8个有效数字,所以除去第一行之外,下面还有8行
第一行为第一个有效数字坐标(行,列,值),即第一个有效数字在原数组处于第几行第几列,实际值是多少,以此构成了稀疏数组
代码构建一个原数组
代码如下
int[][] array=new int[9][9];
array[3][4]=11;
array[7][8]=22;
for (int[] ints : array) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
打印结果
将数组转换为稀疏数组
//1,先记录有多少个有效的值
int sum=0;
for (int[] ints : array) {
for (int anInt : ints) {
if(anInt != 0){
sum++;
}
}
}
System.out.println("有效值个数为="+sum);
//2,创建一个稀疏数组
//稀疏数组第一行存表头,原数组总共几行几列几个有效数,后面有几个有效数,存几行所以这里总共sum+1行,3列
int[][] array_sparse=new int[sum+1][3];
//定义第一行数据
array_sparse[0][0]=array.length;
array_sparse[0][1]=array.length;
array_sparse[0][2]=sum;
//遍历原二位数组,将有效值放入稀疏数组
int index=0;//从第一个有效值开始,为第一列,后遇到一个有效值+1
for (int i=0;i<array.length;i++) {
for (int j=0;j<array.length;j++) {
if(array[i][j] != 0){
index++;//有一个有效数字了,行数加1
array_sparse[index][0]=i;//坐标行
array_sparse[index][1]=j;//坐标列
array_sparse[index][2]=array[i][j];//具体有效值
}
}
}
//打印稀疏数组
for (int[] ints : array_sparse) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
打印结果如下
将稀疏数组还原为原数组
//1,读取稀疏数组中原数组的行和列(稀疏数组第一行第一列为原数组行数,第一行第二列为原数组列数)
int[][] array_restore=new int[array_sparse[0][0]][array_sparse[0][1]];
//2,读取稀疏数组有效数据列,循环稀疏数组,对应坐标给到原数组即可,第一行为表头,所以从第二行开始
for(int i=1;i<array_sparse.length;i++){
//i=1时,代表,第1行第0列事当前有效数在原数组的行,第1行第1列事当前有效数在原数组的列,第1行第2列事当前有效数在原数组的实际值,
array_restore[array_sparse[i][0]][array_sparse[i][1]]=array_sparse[i][2];
}
//打印还原后的数组
for (int[] ints : array_restore) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
打印结果如下