目录
1.例子
在玩五子棋的时候,会有一个存盘、恢复棋盘的功能;这个时候我们可以将棋盘存储到一个二维数组当中,表示每个棋子的位置。如下:
我们使用了0表示空白,1表示黑色棋子,2表示蓝色棋子。这样就将棋盘中棋子的位置转换到了一个数组当中。
2.分析问题
我们看到上面的二维数组是一个11*11的二维数组,这个二维数组当中存放了太多的相同元素,记录了很多无意义的值。所以我们可以换一种方式来存储,减小数组占用的容量,并且还要保持数据的准确性。这个时候我们就可以使用稀疏数组。
3.稀疏数组介绍
当一个数组中,大部分的元素为0或者同一个值的时候,可以使用稀疏数组来保存该数组。
稀疏数组存储数据的方法:
- 稀疏数组的第一行,记录了原始数组的行数、列数和有效元素的数量。
- 把具有不同值的元素的行和列记录在一个小规模的数组中,从而达到缩小程序规模的效果。
图解:
4.使用java代码来实现五子棋的存盘、归档
1.初始化一个二维数组,来表示棋盘
int array[][] = new int[11][11];
2.给二维数组添加元素,来表示棋子在棋盘上的位置及颜色
array[1][2] = 1;
array[2][3] = 2;
System.out.println("原始数组:");
for (int[] arr : array){
System.out.println(Arrays.toString(arr));
}
System.out.println("------------原始数组初始化完成,转稀疏数组----------------");
初始化二维数组完成,接下来将二维数组转化成稀疏数组。
3.要转化成稀疏数组,我们要知道二维数组的有效数据的个数,也就是棋子的数量
int num = 0;
for (int[] arr : array){
for (int i : arr){
if (i != 0) num++;
}
}
4.初始化一个二维数组来表述稀疏数组
int sparse[][] = new int[num+1][3];
sparse[0][0] = 11;
sparse[0][1] = 11;
sparse[0][2] = num;
5.将原始数组的元素信息存储到稀疏数组当中
int row = 1;
for(int i = 0 ; i < array.length ; i++){
for(int j = 0 ; j < array[i].length ; j++){
if (array[i][j] != 0){
sparse[row][0] = i;
sparse[row][1] = j;
sparse[row][2] = array[i][j];
row++;
}
}
}
System.out.println("输出稀疏数组:");
for (int[] sp : sparse){
System.out.println(Arrays.toString(sp));
}
System.out.println("--------------转换稀疏数组完成,还原二维数组------------------");
转换稀疏数组就完成了,也就是我们已经将棋盘进行存档。
接下来我们要进行归档,也就是将稀疏数组还原成原始的二维数组。
6.初始化一个二维数组
int source[][] = new int[sparse[0][0]][sparse[0][1]];
int sum = sparse[0][2];
7.将稀疏数组的数据,写入到二维数组当中
for(int i = 1 ; i <= sum ; i++){
source[sparse[i][0]][sparse[i][1]] = sparse[i][2];
}
System.out.println("还原后的数组:");
for (int[] sou : source){
System.out.println(Arrays.toString(sou));
}
System.out.println("--------------稀疏数组还原完成------------------");
这样我们就简单的完成了棋盘的存档与归档。
我们来看看控制台的输出吧。
原始数组:
[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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
------------原始数组初始化完成,转稀疏数组----------------
输出稀疏数组:
[11, 11, 2]
[1, 2, 1]
[2, 3, 2]
--------------转换稀疏数组完成,还原二维数组------------------
还原后的数组:
[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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
--------------稀疏数组还原完成------------------
Process finished with exit code 0
以上是关于稀疏数组的简单小案例,如有不严谨的地方,麻烦各位大佬评论或私信支教,还请不吝赐教,谢谢!