稀疏数组

实际需求

  • 编写的五子棋程序中,有存盘退出和续上盘的功能
  • 因为该二维数组的很多值是默认值 0 ,因此记录了很多没有意义的数据,我们将其转为稀疏数组进行存储

稀疏数组应用

稀疏数组处理方法
  • 稀疏数组把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

  • 稀疏数组也是二维数组,行数由原数组的数据决定,列数一般为 3 列

  • 稀疏数组的

    第一行

    记录原数组一共有几行几列,有多少个不为零的值

    • 第一列:原数组的行数
    • 第二列:原数组的列数
    • 第三列:原数组有多少个不为零的值
  • 之后的行记录原数组中

    不为零(x)的值

    所在的行数、列数以及 x 的值

    • 第一列:x 在原数组中的行数
    • 第二列:x 在原数组中的列数
    • 第三列:x 的值

举例说明

http://pan-yz.chaoxing.com/preview/showpreview_519252414517313536.html?v=1601729749000

思路分析

  • 使用稀疏数组, 来保留类似前面的二维数组(棋盘、 地图等等)
  • 把稀疏数组存盘, 并且可以从新恢复原来的二维数组数
http://pan-yz.chaoxing.com/preview/showpreview_519252416567435264.html?v=1601729790000

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package sparsearray;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;

/**
* 稀疏阵列
*
* @author Mjg @QQ:2091864671 @Creates by mjg ON 2020/10/1-18:20
* @date 2020/10/01
*/
public class SparseArray {

public static void main(String[] args) throws IOException {
/** 创建一个原始的二维数组11*11 0:表示没有棋子;1:表示黑子;2:表示蓝子 */
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
chessArr1[3][4] = 2;
System.out.println("原始的二维数组~");
for (int[] row : chessArr1) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
/** 将二维数组转 稀疏数组 1.先遍历二维数组 得到非0数据的个数 */
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr1[i][j] != 0) {
sum++;
}
}
}
System.out.println("sum>>>" + sum);

/** 2创建对应的稀疏数组 */
int sprseArry[][] = new int[sum + 1][3];
/**
* 给稀疏数组赋值
*
* <p>原始数据的总列数;总行数;非0的数据
*/
sprseArry[0][0] = 11;
sprseArry[0][1] = 11;
sprseArry[0][2] = sum;
// count是记录第几个非0数据
int count = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr1[i][j] != 0) {
count++;
sprseArry[count][0] = i;
sprseArry[count][1] = j;
sprseArry[count][2] = chessArr1[i][j];
System.out.println(i + "---" + j + "--" + count);
}
}
}
/** 输出稀疏数组的形式 */
System.out.println(sprseArry.length);
System.out.println("得到的稀疏数组为如下形式");
for (int i = 0; i < sprseArry.length; i++) {
System.out.printf("%d\t%d\t%d\t\n", sprseArry[i][0], sprseArry[i][1], sprseArry[i][2]);
}
/** 将稀疏数组存进文件中 */
File file = new File("src/map.data");
FileWriter fileWriter = new FileWriter(file);
for (int i = 0; i < sprseArry.length; i++) {
for (int j = 0; j < sprseArry.length - 1; j++) {
fileWriter.write(sprseArry[i][j] + "\t");
}
fileWriter.write("\r\n");
}
fileWriter.close();

System.out.println("从文件中读取稀疏数组");
Reader reader = new FileReader(file);
int ch;
while ((ch = reader.read()) != -1) {

System.out.print((char) ch);
}

/**
* 将稀疏数组恢复原始数据二维数组
*
* <p>1.先读取稀疏数组的第一行;根据第一行的数据,创建原有的二维数组
*/
System.out.println("恢复后的二维数组");
int chessArr2[][] = new int[sprseArry[0][0]][sprseArry[0][1]];
/** 2.读取稀疏数组后几行的数组(第二行开始);并赋值原来的二维数组即可 */
for (int i = 1; i < sprseArry.length; i++) {
chessArr2[sprseArry[i][0]][sprseArry[i][1]] = sprseArry[i][2];
}
for (int[] row : chessArr2) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
}

打印结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
原始的二维数组~
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 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
sum>>>3
1---2--1
2---3--2
3---4--3
4
得到的稀疏数组为如下形式
11 11 3
1 2 1
2 3 2
3 4 2
从文件中读取稀疏数组
11 11 3
1 2 1
2 3 2
3 4 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 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

Process finished with exit code 0