二维数组和稀疏数组

本文详细介绍了如何将二维数组转换为稀疏数组,并进行还原。通过实例代码展示了转化过程,包括计算有效元素个数、获取稀疏数组头部信息、存储有效元素信息等步骤。在转化过程中,注意了原始数组与稀疏数组中行、列索引的对应关系,以及避免数组越界的问题。最后,文章提到了稀疏数组在数据传输中的优势,并给出了还原二维数组的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二维数组和稀疏数组

问题:将一个二维数组转化为稀疏数组,并还原

1.要点:要知道稀疏数组的构成(以下图片行列值为数组的下角标)

在这里插入图片描述

2.代码的实现

   public static void main(String[] args) {
        int[][] array1 = new int[11][11];
        array1[1][2] =1;
        array1[2][3] =2;
        array1[3][5] =5820;
        System.out.println("原始的数组=============" );
        for (int[] ints : array1) {
            for (int anInt : ints) {
                System.out.print(anInt +"\t");
            }
            System.out.println();
        }

        //转换为稀疏数组
        //1.定义稀疏数组
        int sum =0;//这里的sum是为了获取原始数组中的有效元素的个数
        for (int i = 0; i < array1.length; i++) {
            for (int j = 0; j < array1.length; j++) {
                if (array1[i][j]!=0){
                    sum++;
                }
            }
        }
        int[][] array2 = new int[sum+1][3];//这里的行数为sum+1 表示的是需要存储的有效元素个数为sum个 ,但是 头部信息需要占一行,所以为sum+1

        //2.获取稀疏数组的头部信息,原数组的行数和列数,以及有效元素的个数
        array2[0][0] =11;
        array2[0][1] = 11;
        array2[0][2] =sum;

        //3.在稀疏数组中进行存储有效元素的信息----获取有效元素在原二维数组中的 所在行和所在列
        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++;//count表示原始数组中 有效元素的行数
                    array2[count][0]= i;//在遍历原始二维数组的时候,i表示原始数组所在的行数,j表示原始数组的所在列
                    array2[count][1]=j;//所在列
                    array2[count][2]=array1[i][j];//这个是元素值
                }
            }
        }


        //4.遍历稀疏二维数组
        System.out.println("稀疏二维数组==============");
        for (int[] ints : array2) {
            for (int anInt : ints) {
                System.out.print(anInt +"\t");
            }
            System.out.println();
        }

        //从原始数组到稀疏数组 就相当于一次压缩
        //如在数据传输中就可以节约资源,然后再本地进行解析(对稀疏数组进行解压)
        //从稀疏的头部信息中获取,用于解析稀疏数组的行数和列数
        int[][] array3 = new int[array2[0][0]][array2[0][1]];//array3是用来存放解析后的稀疏数组的
        //从稀疏数组中获取值,然后存放在array3中
        for (int i = 1; i < array2.length; i++) {
                array3[array2[i][0]][array2[i][1]] = array2[i][2];//直接在array3 中的相应的地方存入值即可
        }

        System.out.println("输出还原后的数组===================");
        for (int[] ints : array3) {
            for (int anInt : ints) {
                System.out.print(anInt +"\t");
            }
            System.out.println();
        }

    }
3.这个稀疏数组其实不难,主要在于理解原始数组和稀疏数组中相对应的关系,脑子里有两个数组的模型就可以慢慢一步一步的实现出来
4.碰到的问题:
在下面最开始没有加count ,我是想当然的把count用i代替,很自然的下角标越界,i表示原数组的行数,而count表示的原数组中的有效元素所在行,有很大的区别

然后 "for (int j = 0; j < array1[i].length; j++) " 这里面的array1[i].length和array1.length的区别是二维数组中两个不同的数组

       //3.在稀疏数组中进行存储有效元素的信息----获取有效元素在原二维数组中的 所在行和所在列
        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++;//count表示原始数组中 有效元素的行数
                    array2[count][0]= i;//在遍历原始二维数组的时候,i表示原始数组所在的行数,j表示原始数组的所在列
                    array2[count][1]=j;//所在列
                    array2[count][2]=array1[i][j];//这个是元素值
                }
            }
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值