稀疏数组
概念:当一个数组(或多维)中大部分元素为0,或者为用一个值的数时,可以使用稀疏数组来压缩保存该数组。
-
处理方式:
固定第一行记录数组的大小,第一行最后一列记录有多少个不同的值的个数(除去大部分相同的值)
固定第二行之后记录某位置的具体值 -
具体实际需求场景:
在五子棋程序中,需要实现有存档退出和续上局功能的核心数据结构
分析需求:
五子棋:棋盘
棋盘:二维数组
无棋子:0
黑棋子:1
白棋子:2
【存档功能】 棋盘–> 二维数组(当二维数组足够大时,会有很多默认值为0,因为没有下棋所以为0) --> 稀疏数组(产生于压缩多维数组)–>保存到本地磁盘
【续上局功能】读取本地磁盘–>稀疏数组–>二维数组–>棋盘
public class SparseArray {
public static void main(String[] args) {
/**
* 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来压缩保存该数组
* 稀疏数组处理方式:
* 1.记录数组一共有几行几列,以及有多少个值
* 2.把具有不同值的元素的行列以及值记录在一个小规模的数组中,从而缩小程序的规模
* 稀疏数组应用实例:
* 1.使用稀疏数组,来保存类似棋盘,地图等二维数组
* 2.把稀疏数组存档,并且可以重新恢复原来的二维数组
*/
// 存档功能实现
// 1.创建棋盘 8 * 8 0 表示无棋子, 1 表示黑棋子, 2 表示白棋子
int[][] chesses = new int[8][8];
chesses[1][2] = 1;
chesses[2][3] = 2;
System.out.println(" 8 * 8 棋盘显示========");
formatIter(chesses);
// 2.记录棋盘的大小以及有多少个值
int valueNum = 0;
for (int[] row : chesses) {
for (int data : row) {
if (data != 0) {
valueNum++;
}
}
}
// 3.将二维数组转为稀疏数组
// 稀疏数组的格式固定3列,值+1行 第一行第一列记录行,第一行第二列记录列,第一行第三列记录值
int[][] sparseArray = new int[valueNum + 1][3];
sparseArray[0][0] = chesses.length;
sparseArray[0][1] = chesses.length;
sparseArray[0][2] = valueNum;
// rowNum 表示从第一行记录棋盘的数据(因为第0行记录了棋盘的大小以及棋盘有多少个值)
int rowNum = 1;
for (int i = 0; i < chesses.length; i++) {
for (int j = 0; j < chesses.length; j++) {
int data = chesses[i][j];
if (data != 0) {
sparseArray[rowNum][0] = i;
sparseArray[rowNum][1] = j;
sparseArray[rowNum][2] = data;
rowNum++;
}
}
}
System.out.println("稀疏数组保存的数据=====");
formatIter(sparseArray);
// 4.通过io流保存到本地
// 续上盘功能
// 1.通过io流读取文件
// 2.稀疏数组转为二维数组
int row = sparseArray[0][0];
int col = sparseArray[0][1];
int value = sparseArray[0][2];
int[][] chessesLayout = new int[row][col];
// i 从1开始,因为0记录着棋盘的大小
for (int i = 1; i < value + 1; i++) {
chessesLayout[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
System.out.println("稀疏数组恢复 8 * 8 棋盘======");
formatIter(chessesLayout);
}
/**
* 遍历二维数组格式化输出
* @param twoArray
*/
private static void formatIter(int[][] twoArray) {
for (int[] row : twoArray) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
}
具体代码参考gitee地址:稀疏数组实际应用场景