我们先看一个实际的需求:
编写一个五子棋盘程序,并存在退出后存盘功能和续上盘的功能。
解决方案
- 方案一:将这个棋盘模拟成一个二维数组,将数据存储起来。
- 方案二:使用稀疏数组,将棋盘存储起来,并达到一个数据压缩的效果。
解决方案优劣势分析
- 方案一:
- 优势: 简单方便,代码简单。
- 劣势: 造成数据冗余,有很多不必要的数据存储下来了。
- 方案二:
- 优势:节省储存空间
- 劣势:代码稍微复杂一些
稀疏数组简介
代码实现
public class SparseArray {
public static void main(String[] args) {
// 首先我们创建一个存储有数据的二维数组,6行7列
int[][] array = new int[6][7];
// 给数组里面添加数据
int[0][2] = 22;
int[0][6] = 15;
int[1][1] = 11;
int[1][5] = 17;
int[2][3] = -6;
int[3][5] = 39;
int[4][0] = 91;
int[5][2] = 28;
}
/**
* 传入一个非空大小的二维数组,转成一个二维的稀疏数组
*
* @param 二维数组
*/
public int[][] arrayToSparse(int[][] array) {
// 1. 遍历数组计算出该数组的有效数据的个数
int sum = 0;
for (int i = 0;i < array.length();i++) {
for (int j = 0;i< array[0].length();j++) {
if (array[i][j] != 0) {
sum += 1;
}
}
}
// 2. 创建一个稀疏数组
int[][] sparse = int[sum+1][3];
// 给第一行填充数据
sparse[0][0] = array.length();
sparse[0][1] = array[0].length();
sparse[0][2] = sum;
// 3. 遍历数组给稀疏数组填充数据
int row = 1;
for (int i = 0;i < array.length();i++) {
for (int j = 0;i< array[0].length();j++) {
if (array[i][j] != 0) {
// 记录数据行数
sparse[row][0] = i;
// 记录数据列数
sparse[row][1] = j;
// 记录数据
sparse[row][2] = array[i][j];
row += 1;
}
}
}
// 4. 返回稀疏数组
return sparse;
}
/**
* 将稀疏数组复盘成为普通的数组
*
* @param sparse 稀疏数组
*/
public int[][] sparseToArray(int[][] sparse) {
// 1. 创建一个普通的数组
int[][] array = new int[sparse[0][0]][sparse[0][1]];
// 2. 遍历稀疏数组
for (int i = 1;i < sparse.length();i++) {
array[sparse[i][0]][sparse[i][1]] = sparse[i][3];
}
}
}
代码写完了,这种方式储存数据可以达到压缩的效果,有人说你的步骤这么麻烦,还不如直接存起来就行了,其实这是一个用时间换空间的算法。