定义:

稀疏数组可以看成是普通数组的压缩,节省不必要的资源
这里的普通数组是指数组中的数据总数远远大于非零数据的数量并且非零元素的分布没有规律

使用:

当一个数组中存在多个很少有效数据,并且大量数据为非有效数据即可使用稀疏数组存储

引入:

  • 编写一个五子棋程序,有存盘退出和续上盘的功能。棋盘是11×11格局。

  • 思路:使用二维数组记录棋盘,默认数组为0,1代表黑色棋子。2代表蓝色棋子。

     

img

img

代码:

        //将棋盘打印
       int[][] array1 = new int[11][11];
       array1[1][2] = 1;
       array1[2][4] = 2;
       for (int[] ints : array1) {
           for (int i : ints) {
               System.out.print(i + "\t");
          }
           System.out.println();
      }
       //转换成稀疏数组
       int sum = 0;//记录非零的数据
       for (int i = 0; i < 11; i++) {
           for (int j = 0; j < 11; j++) {
               if (array1[i][j] != 0) {
                   sum++;
              }
          }
      }
//创建一个稀疏数组保存数据
       int[][] array2 = new int[sum + 1][3];
       array2[0][0] = 11;
       array2[0][1] = 11;
       array2[0][2] = sum;
       //遍历二维数组,将非零数存到稀疏数组中
       int count = 0;
       for (int i = 0; i < array1.length; i++) {
           for (int j = 0; j < array1[i].length; j++) {
               if (array1[i][j] != 0) {
                   count++;
                   array2[count][0] = i;
                   array2[count][1] = j;
                   array2[count][2] = array1[i][j];
              }
          }
      }
       //打印稀疏数组
       System.out.println("打印稀疏数组");
       for (int i = 0; i < array2.length; i++) {
           System.out.println(array2[i][0] + "\t" +
                   array2[i][1] + "\t" +
                   array2[i][2]);
      }
       //把稀疏数组还原至原数组
       //先读取稀疏数组
       System.out.println("还原至原数组");
       int[][] array3 = new int[array2[0][0]][array2[0][1]];
       //给数组赋值
       for (int i = 1; i < array2.length; i++) {
           array3[array2[i][0]][array2[i][1]] = array2[i][2];
      }
       for (int[] ints : array3) {
           for (int i : ints) {
               System.out.print(i + "\t");
          }
           System.out.println();
      }