稀疏数组可以对数组进行简单的压缩,保留其中的非零数字
编辑思路如下:
以一个11*11的数组为例,数组如下
很明显在图片中,有效数字的个数为2,分别位于第一行第二列,以及第二行第三列,其他位置都为0.对于此种的数组进行转化为稀疏数组,如下:
第一行为数组的整体信息,表示为11行11列的数组,且具有两个非0数字
鉴于具有两个非0的数字,因此需要对上述两个非零的数字的具体信息加以记载
第二行记载的为第一个有效数字的位子以及大小。
第三行记载的为第二个有效数字的位子以及大小。
原理如上所示,那么代码实现如下:
//创建11*11的数组
//满足第一行第二列数字为1,第二行第三列数字为2
//其余数字为0
public class array {
public static void main(String[] args) {
int [] [] array1=new int[11][11];
array1[1][2]=1;
array1[2][3]=2;
//输出原始数组
for (int[] ints : array1){
for(int anInt : ints){
System.out.print(anInt+"\t");
}
System.out.println( );
}
System.out.println("输出原始数组:");
//遍历输出数组中全部元素
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
System.out.print(array1[i][j]);
System.out.print(' ');
if(j==10){
System.out.print('\n');
}
}
}
//转换为稀疏数组
//获取有效值的个数
int sum=0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if(array1[i][j]!=0){
sum++;}
}
}
System.out.print("输出有效值的个数为:"+sum);
//转换为稀疏数组
int[][]array2=new int[sum+1][3];
array2[0][0]=11;
array2[0][1]=11;
array2[0][2]=sum;
//遍历二维数组,将非零值存入稀疏数组
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];
}
}
}
//输出稀疏数组的形式
System.out.println("输出稀疏数组:");
for (int i=0;i<array2.length;i++){
for (int j=0;j<array2.length;j++)
{
System.out.print(array2[i][j]+" ");
if (j== array2.length-1){
System.out.print('\n');
}
}
}
//还原稀疏数组
int[][]array3=new int[array2[0][0]][array2[0][1]];//读取整体数组的信息,建立原始数组
//填充有效数字
for(int i = 1;i< array2.length;i++){
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
System.out.println("输出原始数组:");
//使用增强for循环
for (int[] ints : array1){
for(int anInt : ints){
System.out.print(anInt+"\t");
}
System.out.println( );
}
}
}
上述代码过程包含原始数组转化为稀疏数组以及再转化为原始数组
代码实现结果:
输出原始数组中包含了增强型FOR循环输出,以及普通的双重for循环遍历输出。
以上仅为个人见解,不足之处,多多指教。