【基础】数组和稀疏数组的转换

稀疏数组怎么来的

如上图所示左边是原数组,右边是稀疏数组,为了简化原数组,去掉重复无效的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();
       }

打印结果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值