稀疏数组的实现与返回

目录

稀疏数组

 思路

二维数组转稀疏数组:

稀疏数组转二维数组:

实现

 变为稀疏数组

稀疏数组返回


稀疏数组

将大量的零消去(压缩)

第一个元素来存放原始的数组一共有几行 几列 总共有多少值

之后的元素来存放 每个有效元素所在的行 列 自身值

如图,将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();
        }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值