生命不息,学习不止,对一切都要维持敬畏之心。
若有不正之处,请谅解和批评指正,不胜感激。
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.结果