1.背景
在五子棋程序中有存盘和持续上盘的功能,如图
问题:因为使用二维数组的时候有很作默认值是0,因此记录了很多没有意义的数据。怎么才能使存放的数据都是有意义的数而又能不浪费空间呢?使用稀疏数组。
2.基本介绍
当一个数组中大部分是0,或者为同一个数组时,可以使用稀疏数组来保存该数组。
处理方法
1)记录数组一共有几行几列,有多少个有效的值
2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
举例
应用实例
1)使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)
2把稀疏数组存盘,并且可以从新恢复原来的二维数组数
3.转换分析
二维数组 转 稀疏数组的思路
- 遍历 原始的二维数组,得到有效数据的个数 sum
- 根据sum 就可以创建 稀疏数组 sparseArr int[sum + 1] [3]
- 将二维数组的有效数据数据存入到 稀疏数组
稀疏数组转原始的二维数组的思路
- 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 = int [11][11]
- 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.
4.具体实现
public class SparseArr {
public static void main(String[] args) {
//得到原始的二维数组
int [][] chessArr = new int[4][4];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
System.out.println("原数组");
for (int i = 0; i < chessArr.length ; i++) {
for (int j = 0; j < chessArr[i].length ; j++) {
System.out.printf("%d\t",chessArr[i][j]);
}
System.out.println();
}
//遍历 原始的二维数组,得到有效数据的个数 sum
int sum = 0;
for(int [] row : chessArr){
for (int value : row){
if(value>0){
sum ++;
}
}
}
//根据sum 就可以创建 稀疏数组 sparseArr int[sum + 1] [3]
int[][] sparseArr = new int[sum+1][3];
sparseArr[0][0] = chessArr.length; //行
sparseArr[0][1] = chessArr[0].length; //列
sparseArr[0][2] = sum;
//将二维数组的有效数据数据存入到 稀疏数组
int count = 0 ;//用于存储存取了多少个有效数据
for (int i = 0;i<chessArr.length;i++){
for (int j=0;j<chessArr[i].length;j++){
if(chessArr[i][j]!=0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr[i][j];
}
}
}
System.out.println("得到的稀疏数组~~~~");
for (int i = 0; i < sparseArr.length ; i++) {
System.out.println(sparseArr[i][0]+"\t"+sparseArr[i][1]+"\t"+sparseArr[i][2]);
}
//先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 = int [11][11]
int row = sparseArr[0][0];
int col = sparseArr[0][1];
System.out.println(row);
System.out.println(col);
int[][] chessArr2 = new int[row][col];
for (int i = 1; i < sparseArr.length ; i++) {
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
System.out.println("还原后数组");
for (int i = 0; i < chessArr2.length ; i++) {
for (int j = 0; j < chessArr2[i].length ; j++) {
System.out.printf("%d\t",chessArr2[i][j]);
}
System.out.println();
}
}
}