浅谈:稀疏数组与二维数组之间的转换

学习笔记

二维数组简介

二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,类型说明符 数组名[常量表达式][常量表达式]。二维数组又称为矩阵,行列数相等的矩阵称为方阵。对称矩阵a[i][j] = a[j][i],对角矩阵:n阶方阵主对角线外都是零元素。

二维数组

二维数组类似于五子棋的棋盘
在这里插入图片描述

引入稀疏数组

假如我们有二维数组,需要保存,发现上面的数据有很多数据是无效的数据,有效数据只有2个
这样保存下来会有很多的无效数据,假如无效数据过于庞大,会大大的影响网络传输效率等,所以就可以通过稀疏数组来让无效的数据消失.

代码解析(详细解释在代码注释中,二维数组转稀疏数组转二维数组)

package com.fs.demo01;
/*
稀疏数组
将原本二维数组多余的数据去除,保留原本的有效数据,降低数据的大小,提升效率
 */
public class SparseArray {
    public static void main(String[] args) {
        //创建二维数组,来表示棋盘
        //0表示棋盘的点,1表示黑子,2表示蓝子
        int doubleArray[][] = new int[11][11];
        //给第2排的第3列放上一个黑子(行列从索引0开始)
        doubleArray[1][2] = 1;
        //给第三排的第4列放上一个蓝子
        doubleArray[2][3] = 2;
        //输出一下二维数组
        //循环遍历两次,因为二维数组是两个一维数组合成
        System.out.println("原始二维数组棋盘----------------------------");
        for (int[] ints : doubleArray) {
            for (int anInt : ints) {
                //排版一下
                System.out.printf("\t"+anInt);
            }
            //换行
            System.out.println();
        }

        System.out.println("将二维数组转成稀疏数组------------------------");
        //先遍历二维数组中数据非0 的个数
        //定义一个变量保存非0的个数
        int sum = 0;
        for (int i = 0; i < doubleArray.length; i++) {
            int[] ints = doubleArray[i];
            for (int j = 0; j < ints.length; j++) {
                int anInt = ints[j];
                if (anInt!=0){
                    sum++;
                }
            }
        }
        System.out.println("二维数组中已经存放的棋子个数为:"+sum);
        /**
         *  对应我们上面的二维数组
         *                                      稀疏数组格式
         *                          对应二维数组的行   对应二维数组的列    对应的值
         *    第一行是二维数组的格式     11(二维数组行)     11(二维数组列)   2(有效值)
         *    后面的就是对应二维数组的          1               2           1
         *    实际坐标                        2               3           2
         *
         *
         *      打印结果:
         *      	11	11	2
         * 	        1	2	1
         * 	        2	3	2
         */
        //创建稀疏数组 行为sum+1,因为有一个二维数据数据行  列永远是三
        int sparseArray[][] = new int[sum+1][3];
        //给稀疏数组的行列复制
        sparseArray[0][0] = doubleArray.length;//第一行第一列
        sparseArray[0][1] = doubleArray.length;//第一行第二列
        sparseArray[0][2] = sum;//第一行第三列
        //遍历二维数组,当二维数组有值得时候记录坐标,将值赋值给稀疏数组
        //定义一个变量来存储当前是洗漱数组的第几行
        int row = 1;//稀疏数组从第二行开始,因为第1行存放了二维数组的数据
        for (int i = 0; i < doubleArray.length; i++) {
            int[] ints = doubleArray[i];
            for (int j = 0; j < ints.length; j++) {
                int anInt = ints[j];
                if (anInt!=0){
                    sparseArray[row][0] = i;//row行的第1列存档有数据的行
                    sparseArray[row][1] = j;//row行的第二列存放二维数组有数据的列
                    sparseArray[row][2] = doubleArray[i][j];//row行的第三列存放有数据的二维数组本身的值
                    row++;//存放完加一行
                }
            }
        }
        //循环遍历打印一下稀疏数组
        for (int[] ints : sparseArray) {
            for (int anInt : ints) {
                //排版一下
                System.out.printf("\t"+anInt);
            }
            //换行
            System.out.println();
        }

        System.out.println("将稀疏数组恢复成二维数组-----------------------");

        /**
         * 在将稀疏数组恢复成二维数组
         * 1.先读取稀疏数组的第一行数据,根据第一行数据恢复原来的二维数组平面
         * 2.然后读取稀疏数组的第二行后的数据,第二行的第一列就是有效值在二维数组的行,第二行的第二列就是有效值在二维数组的列,第二行的第三列就是有效值
         *
         */

        //创建恢复的二维数组.sparseArray[0][1]==11 sparseArray[0][2]==11
        int doubleArrayNew[][] = new int[sparseArray[0][0]][sparseArray[0][1]];

        //循环稀疏数组,从第二行开始,将行列赋值在新的二维数组中
        for (int i = 1; i < sparseArray.length; i++) {
            /*
                    对应稀疏数组的形态来看

                	11	11	2
          	        1	2	1
          	        2	3	2

          	        循环第一次的时候
          	        sparseArray[i][0] = 1  sparseArray[i][1]=2  sparseArray[i][2]=1
          	        循环第二次的时候
          	        sparseArray[i][0] = 2  sparseArray[i][1]=3  sparseArray[i][2]=2
             */

            doubleArrayNew[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
        }
        //打印一下新的二维数组,看打印结果是否和原来的一样
        for (int[] ints : doubleArrayNew) {
            for (int anInt : ints) {
                //排版一下
                System.out.printf("\t"+anInt);
            }
            //换行
            System.out.println();
        }
    }
}

执行结果

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值