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

京公网安备 11010502036488号