[toc]

稀疏数组 SparseArray

1. 案例分析

稀疏数组和二维数组,使两种数据结构可以轻松的转换,从而实现五子棋程序中有存盘和续上盘的功能。

  • image-20200221150623882

2. 代码实现

在二维数组中数组名.length指示数组的行数,数组名[行下标] .length指示该行中的元素个数。

  • 二维数组转换成稀疏数组,并且储存到map.data
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
public class SparseArrayOut{
//创建一个main方法,用来实现五子棋(二维数组转存为稀疏数组)
public static void main(String[] args) throws IOException{

//第一步:创建一个11*11的二维数组(五子棋棋盘)
int[][] array = new int[11][11];

//在二维数组里面,0 1 2 分别表示 没有放棋子 黑子 白子

array[2][1] = 1;
array[2][3] = 2;
array[4][5] = 2;

//遍历二维数组,显示原始的棋盘布局
System.out.println("原始的二维数组");
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
System.out.print(array[i][j]);
}
System.out.println();
}

//将二维数组转成稀疏数组,首先遍历数组获得值不为0的个数
int sum = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
if(array[i][j]!=0) {
//sum就是value[0]的值
sum++;
}
}
}

//得到棋子的数量
System.out.println("这局共有"+sum+"个棋子");

//根据已知的棋子数,创建稀疏数组
int[][] sparseArr = new int[sum+1][3];
//给稀疏数组赋值
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;

//遍历二维数组,将非零值放到sparseArr中
int count = 0;//用于记录是第几个非0数据,即是索引

for (int i = 0; i <array.length; i++) {
for (int j = 0; j < array.length; j++) {
if(array[i][j]!=0) {
//这一段是?
count++;
sparseArr[count][0]=i;
sparseArr[count][1]=j;
sparseArr[count][2]=array[i][j];

}
}
}

//输出稀疏数组的形式,并且存盘
System.out.println("得到稀疏数组为......");

File file = new File("E:/file/","map.data");
FileOutputStream fos = new FileOutputStream(file);

for (int i = 0; i < sparseArr.length; i++) {
// %d 打印十进制整数
// \t 横向制表符
// \n 换行
System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
fos.write(sparseArr[i][0]);
fos.write(sparseArr[i][1]);
fos.write(sparseArr[i][2]);
}
fos.close();
System.out.println();
}
}
  • map.data中读取数据,并将其还原成二维数组
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
public class SparseArrayIn{
//创建一个main方法,用来实现五子棋
public static void main(String[] args) throws IOException{
File file = new File("E:/file/","map.data");
FileInputStream fis = new FileInputStream(file);
int row = fis.read();
int col = fis.read();
int value = fis.read();


//1.先读取稀疏数组的第一行,根据第一行新建数组
int[][] array2 = new int[row][col];

//2.读取稀疏数组后几行数据

for (int i = 1; i <= value; i++) {
int rows = fis.read();
int cols = fis.read();
int values = fis.read();
array2[rows][cols]=values;
}
fis.close();



//输出恢复后的数据
System.out.println("恢复后的二维数组");

for (int[] rowss : array2) {

for (int data : rowss) {
System.out.printf("%d\t",data);

}
System.out.println();
}

}
}