什么是稀疏数组?
编写一个五子棋程序,有存盘退出的功能。
我们想到用二维数组来记录棋盘上各个点的棋子,但棋盘上不是每个点都有棋子,没有棋子的点在二维数组中会是默认值,如果棋盘上空子的地方很多,就会有很多无意义的数据
这个时候我们可以使用稀疏数组来进行压缩
基本介绍: 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组
处理方法是:
1) 记录数组一共有几行几列,有多少个不同的值
2) 把具有不同值的元素的行列值记录在一个小规模数组中,从而缩小程序的规模
实现稀疏数组:
实现一个稀疏数组,来保存上面的二维数组
把稀疏数组存盘,并且可以恢复原来的二维数组
public static void main(String[] args) {
//初始化原始数组
int chessArr[][] = new int[11][11];
//原始数组的值
chessArr[1][3] = 1;
chessArr[4][2] = 2;
//打印原始数组
System.out.println("============chessArr=============");
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();
}
//循环原始数组,判断有多少个不为默认0的数
int diffSum = 0;
for(int i = 0;i < chessArr.length;i++) {
for(int j = 0;j < chessArr[i].length;j++) {
if(chessArr[i][j] != 0) {
diffSum++;
}
}
}
//根据上面的结果创建稀疏数组
int sparseArr[][] = new int[diffSum+1][3];
//循环原始数组,将不为默认值的行、列、值 记录到稀疏数组
sparseArr[0][0] = chessArr.length;
sparseArr[0][1] = chessArr[0].length;
sparseArr[0][2] = diffSum;
int row = 1;
for(int i = 1;i < chessArr.length;i++) {
for(int j = 0;j < chessArr[i].length;j++) {
if(chessArr[i][j] != 0) {
sparseArr[row][0] = i;
sparseArr[row][1] = j;
sparseArr[row][2] = chessArr[i][j];
row++;
}
}
}
//打印稀疏数组
System.out.println("============sparseArr=============");
for(int i = 0;i < sparseArr.length;i++) {
for(int j = 0;j < sparseArr[i].length;j++) {
System.out.printf("%d\t", sparseArr[i][j]);
}
System.out.println();
}
//记录棋盘到文件
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream(new File("E://map.data")));
oos.writeObject(sparseArr);
oos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (oos != null) {
oos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
//反序列化
int sparseArrFromFile[][] = new int[0][];
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream(new File("E://map.data")));
sparseArrFromFile = (int[][]) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
if (ois != null) {
ois.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
//打印反序列化的稀疏数组
System.out.println("============sparseArrFromFile=============");
for(int i = 0; i < sparseArrFromFile.length; i++) {
for(int j = 0;j < sparseArrFromFile[i].length;j++) {
System.out.printf("%d\t", sparseArrFromFile[i][j]);
}
System.out.println();
}
//从稀疏数组恢复原始数组 并打印
int originalArr[][] = new int[sparseArrFromFile[0][0]][sparseArrFromFile[0][1]];
for(int i = 1; i < sparseArrFromFile.length; i++) {
originalArr[sparseArrFromFile[i][0]][sparseArrFromFile[i][1]] = sparseArrFromFile[i][2];
}
System.out.println("============originalArr=============");
for(int i = 0;i < originalArr.length;i++) {
for(int j = 0;j < originalArr[i].length;j++) {
System.out.printf("%d\t", originalArr[i][j]);
}
System.out.println();
}
}
============chessArr=============
0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 2 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
============sparseArr=============
11 11 2
1 3 1
4 2 2
============sparseArrFromFile=============
11 11 2
1 3 1
4 2 2
============originalArr=============
0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 2 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0