生命不息,学习不止,对一切都要维持敬畏之心。
若有不正之处,请谅解和批评指正,不胜感激。

1.先说说二维数组

  • 二维数组就是一堆一维数组为元素的数组。
  • 没有二维数组这种引用型数据类型。
  • 二维数组定义
    //数据类型[][] 数组名 = new 数据类型[m][n];
    int[][] arr = new int[3][2];
    //数据类型[][] 数组名 = new 数据类型[m][];
    int[][] arr = new int[3][];
    //数据类型[][] 数组名 = {{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};
    int[][] arr = {{1,2,3},{4,5},{6}};
  • 二维数组的创建过程
    图片说明

2.再来看看为什么要使用稀疏数组

稀疏数组(Sparse array) ,所谓稀疏数组就是数组中大部分的内容值都未被使用,在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。

3.稀疏数组结构

图片说明
-- 稀疏数组只需要3列
-- 第一行记录这原数组行数列数和非零值个数
-- 第二行开始记录非零值在原数组的行索引列索引和值

4.来个栗子

将棋盘存入本地磁盘

5.思路

-- 棋盘可以看做一个二维数组
-- 棋盘中有三种状态,黑白空
-- 汪汪:二维数据效率太浪费空间了,假设白子为1,黑子为2,没有下的地方为0,我们可以发现很多的值都为0,建议使用稀疏数组保存

6.二维数组与稀疏数组间的互相转换

/**
 * 稀疏数组
 */
public class SparseArray {

    public static void main(String[] args) {
        //定义9行9列二维数组
        int[][] normalArr=new int[9][9];
        //初始化黑白子
        //知识点:int数组指定长度初始化默认值为0
        normalArr[1][2]=1;
        normalArr[3][4]=2;
        System.out.println("定义的二维数组:");
        //记录非0值个数
        int count=0;
        for (int[] item :
                normalArr) {
            for (int i = 0; i < item.length; i++) {
                if(item[i]!=0){
                    count++;
                }
                System.out.printf("%d\t",item[i]);
            }
            System.out.println();
        }

        //定义稀疏数组
        int[][] sparseArr=new int[count+1][3];
        sparseArr[0][0]=9;
        sparseArr[0][1]=9;
        sparseArr[0][2]=count;
        int sparArrCount=1;
        int normalArrCount=0;
        for (int[] item :
                normalArr) {
            for (int i = 0; i < item.length; i++) {
                if (item[i]!=0){
                    sparseArr[sparArrCount][0]=normalArrCount;
                    sparseArr[sparArrCount][1]=i;
                    sparseArr[sparArrCount][2]=item[i];
                    sparArrCount++;
                }
            }
            normalArrCount++;
        }

        //输出稀疏数组
        System.out.println("转换的稀疏数组:");
        for (int[] item :
                sparseArr) {
            for (int i = 0; i < item.length; i++) {
                System.out.printf("%d\t",item[i]);
            }
            System.out.println();
        }

        //稀疏数组还原普通数组
        int[][] returnNormalArr=new int[sparseArr[0][0]][sparseArr[0][1]];
        int num=1;
        for (;num< sparseArr.length; num++) {
            returnNormalArr[sparseArr[num][0]][sparseArr[num][1]]=sparseArr[num][2];
        }

        System.out.println("还原的稀疏数组为:");
        for (int[] item :
                returnNormalArr) {
            for (int i = 0; i < item.length; i++) {
                System.out.printf("%d\t",item[i]);
            }
            System.out.println();
        }
    }
}

7.结果

图片说明