稀疏数组(sparsearray)
基本介绍
因为该二维数组的很多值是默认值 0,因此记录了很多没有意义的数据,我们可以使用稀疏数组来保存该数组。
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法是:
(1)记录数组一共有几行几列,有多少个不同的值
(2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
案例:
原始的二维数组:
压缩的稀疏数组:
应用案例:
(1)使用稀疏数组,来保留二维数组(棋盘信息,地图等)
(2)把稀疏数组存盘,并且可以从新恢复原来的二维数组数据
(3)思路分析
(4)代码实现
1 public class SparseArray { 2 3 public static void main(String[] args) { 4 // 创建原始二维数组 11*11 5 // 0 表示没有棋子,1表示黑子,2表示篮子 6 int chessArr1[][] = new int[11][11]; 7 chessArr1[1][2] = 1; 8 chessArr1[2][3] = 2; 9 10 // 输出原始二维数组 11 for(int[] row : chessArr1) { 12 for(int data : row) { 13 System.out.printf("%d\t",data); 14 } 15 System.out.println(); 16 } 17 18 // 把二维数组转成稀疏数组 19 // 1. 先遍历二维数组,得到非0数据的个数 20 int sum = 0; 21 for(int i = 0;i < chessArr1.length;i++) { 22 for(int j = 0;j < chessArr1.length;j++) { 23 if(chessArr1[i][j] != 0) { 24 sum++; 25 } 26 } 27 } 28 29 // 2.创建稀疏数组 30 int sparseArr[][] = new int[sum+1][3]; 31 // 给稀疏数组赋值 32 sparseArr[0][0] = chessArr1.length; 33 sparseArr[0][1] = chessArr1.length; 34 sparseArr[0][2] = sum; 35 36 // 遍历二维数组,将非0的值存放到稀疏数组中 37 int count = 0; // 记录是第几个非0数据 38 for(int i = 0;i < chessArr1.length;i++) { 39 for(int j = 0;j < chessArr1.length;j++) { 40 if(chessArr1[i][j] != 0) { 41 count++; 42 sparseArr[count][0] = i; 43 sparseArr[count][1] = j; 44 sparseArr[count][2] = chessArr1[i][j]; 45 } 46 } 47 } 48 49 // 输出稀疏数组 50 System.out.println("============"); 51 System.out.println("稀疏数组为:"); 52 for(int i = 0;i < sparseArr.length;i++) { 53 System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]); 54 } 55 56 System.out.println("============"); 57 58 //将稀疏数组转换为原始的二维数组 59 // 1.先读取稀疏数组的第一行,根据第一行的数据,创建元素的二维数组 60 61 int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]]; 62 63 // 2.在读取稀疏数组后几行的数据(从第二行开始),并赋给原始的二维数组即可 64 65 for(int i = 1;i < sparseArr.length;i++) { 66 chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2]; 67 } 68 69 70 //输出恢复后的二维数组 71 for(int[] row : chessArr2) { 72 for(int data : row) { 73 System.out.printf("%d\t",data); 74 } 75 System.out.println(); 76 } 77 78 } 79 80 }
(5)数组存盘与读盘
代码实现:
1 System.out.println("稀疏数组为:");
2 for(int i = 0;i < sparseArr.length;i++) {
3 System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
4 }
5 // 稀疏存盘
6 FileWriter fos = new FileWriter("F:\\a.txt");
7 for(int i = 0;i < sparseArr.length;i++) {
8 for(int j = 0;j < 3;j++) {
9
10 fos.write(sparseArr[i][j]+"\t");
11 }
12 fos.write("\r\n");
13 }
14
15 fos.close();
16
17 // 读取稀疏数组
18 BufferedReader br = new BufferedReader(new FileReader("F:\\a.txt"));
19 String line; //一行数据
20 int row=0;
21 int[][] arr2 = new int[3][3]; // 存放的数组
22 //逐行读取,并将每个数组放入到数组中
23 while((line = br.readLine()) != null){
24 String[] temp = line.split("\t");
25 for(int j=0;j<temp.length;j++){
26
27 arr2[row][j] = Integer.parseInt(temp[j]);
28 }
29 row++;
30 }
31 br.close();
32
33 // 遍历取出的稀疏数组
34 for(int[] i : arr2) {
35 for(int item : i) {
36 System.out.print(item+"\t");
37 }
38 System.out.println();
39 }