首页 > 技术文章 > 稀疏数组

niujifei 2019-09-18 12:14 原文

稀疏数组(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 }
View Code

 

   (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         }

 

 

  

推荐阅读