二维数组与稀疏数组的转换

       本人小白一枚,一直以来都是穿行与各大博客网站,有想过尝试着去写一写记录一下自己学到的一些东西,但是吧以前也只都是想想没有实际去行动,这不今天下定决心在博客上记录自己的小白成长之路。从0到1的路很难,唯有一颗坚定的心。

      今天呢就记录一下前段时间学的数据结构与算法之二维数组与稀疏数组的转换。以下就拿图来演示吧

二维数组与稀疏数组的转换_第1张图片

从左往右表示的是:五子棋盘,二维数组的表现形式,稀疏数组(二维数组转换后),这里就不做太多解释,详细解释都在代码里,有不好的地方希望大神留言提示(膜拜),话不多说直接上码吧。

package com.crbhf.sparsearray;

/**
 * 二维数组与稀疏数组的相互转换 二维数组的结构就相当于坐标  行与列
 * 本次二维数组示例用于演示五子棋盘的格局  空白表示0,1表示黑子,2表示蓝子
 * 应用场景:当玩家正在游戏中突然有事要离开,那么玩家又想保存本次游戏(也就是存档),
 * 那么原始棋盘是用二维数组来表示,其中棋盘中肯定还有很多空白处也就是玩家没有落子的空处,
 * 那么我们则优先考虑当用户要存档时只保留有效数据,也就是用户已经落子的数据,其他数据则无需存档
 * 这个时候稀疏数组可以达到我们的需求,优化原始二维数组,保留用户的有效数据
 * @Author 超人不会飞
 * @Create 2019/6/17
 */
public class TestSparseArray {
    public static void main(String[] args) {
        /**
         * 1.创建原始的二维数组
         * 2.二维数组的初始赋值  用于演示原始二位数组的容量大小
         */
        int chessArr[][] = new int[11][11];//原始二维数组的创建
        chessArr[0][5] = 1;//表示黑子
        chessArr[1][6] = 2;//表示蓝子
        //输出棋盘格局 二维数组的遍历
        System.out.println("-----------------原始二维数组--------------------");
        for (int[] row : chessArr) {
            for (int data : row) {
                System.out.printf("%d\t",data); //输出格局
            }
            System.out.println();
        }
        System.out.println("-----------------原始二维数组--------------------");
        /**
         * 分析稀疏数组的转换思路  稀疏数组也就是二维数组  只不过稀疏数组的结构是n+1行*3列 为什么是n+1 如下解释:
         * 稀疏数组的结构为:第一行记录的是原始数组的整体数据
         * 第一行第一列表示(row):也就是原始二维数组的行
         * 第一行第二列表示(col):也就是原始二维数组的列
         * 第一行第三列表示(val):也就是原始二维数组的有效数据
         * 而后面的n行则表示原始二维数据的有效数据坐标
         * 那么n表示的就是原始二维数组(五子棋盘玩家的落子个数)的有效数据个数
         * 例如:原始二维数组有效数据(五子棋盘的落子个数)为两个 那么就是2+1行*3列
         */
        //那么首先要得到原始二维数组的有效数据个数
        int sum = 0; //由于计算原始二维数组的有效数据值
        //遍历原始二维数组
        for (int i = 0;i < 11;i++){ //行
            for (int j =0;j < 11;j++){ //列
                //判断原始二维数据的数据是否不为0
                if(chessArr[i][j] != 0){
                    //如果不为0 那么就是有效数据  则sum++
                    sum++;
                }
            }
        }
        //验证数据是否正确  输出sum
        System.out.println("二维数组中的有效数据 sum = "+sum);

        /**
         * 得到数据后 进行转换
         * 定义稀疏数组
         */
        int sparseArr[][] = new int[sum+1][3]; //得到稀疏数组结构
        //给稀疏数组第一行赋值
        sparseArr[0][0] = 11;   //第一行第一列表示(row):也就是原始二维数组的行
        sparseArr[0][1] = 11;   //第一行第二列表示(col):也就是原始二维数组的列
        sparseArr[0][2] = sum;  //第一行第三列表示(val):也就是原始二维数组的有效数据
        //原始二维数据的轮廓有了  那么现在就是要把原始的二维数据添加到稀疏数组中 也就是给稀疏数组的后面n行赋值
        //再次遍历原始二维数组 count表示原始二维数组的有效数据个数
        int count = 0;
        for (int i = 0;i < 11;i++){ //行
            for (int j =0;j < 11;j++){ //列
                //判断原始二维数据的数据是否不为0
                if(chessArr[i][j] != 0){
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr[i][j];
                }
            }
        }
        //遍历输出稀疏数组的数据
        System.out.println("-----------------二维数组转换成稀疏数组(容量缩小3*3)--------------------");
        for (int i = 0;i < sparseArr.length;i++){
            System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
        }
        System.out.println("-----------------二维数组转换成稀疏数组--------------------");

        /**
         * 既然实现了二维数组转稀疏数组  那么继续实现稀疏数组转二维数组  也就是还原 有始有终
         * 思路分析  当我们要把稀疏数组转换成原始二维数组时 首先能想到的就是稀疏数组中的第一行数据
         * 第一行第一列表示(row):也就是原始二维数组的行
         * 第一行第二列表示(col):也就是原始二维数组的列
         * 第一行第三列表示(val):也就是原始二维数组的有效数据
         */
        //定义二维数组
        int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];//sparseArr[0][0]]表示稀疏数组的第一行第一列 [sparseArr[0][1]这个就不用说啦
        //还原了原始数据的轮廓后 就是对值的还原 遍历稀疏数组
        for (int i = 1;i < sparseArr.length;i++){ //为啥i = 1?  懂了吗?
            //稀疏数组的第三列才是原始数组的值 So Easy
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        System.out.println();
        //现在遍历还原后的二维数组是否与原始二维数组一致
        System.out.println("-----------------还原后的二维数组--------------------");
        for (int[] row : chessArr2) {
            for (int data : row) {
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }
        System.out.println("-----------------还原后的二维数组--------------------");
    }
}

再来看看运行的效果图:

二维数组与稀疏数组的转换_第2张图片

在结合一下第一张图Nice


OK 第一篇博客就到这里啦,欢迎留言.....

拜拜~ 

 

你可能感兴趣的:(Java,数据结构与算法)