java稀疏数组


稀疏数组

引入

需求:五子棋的棋盘存储

 

因为要存储许多默认值是0,是非常浪费空间资源的,所以把这些压缩起来----->稀疏数组

介绍

  • 当一个数组中大部分元素为0,或者相同值时,可以使用稀疏数组来保存他们。

  • 记录数组一共有几行几列,有多少个不同值

  • 把具有不同值的元素和行列的值记录在一个小规模的数组中,从而缩小程序规模。

 

稀疏数组的创建,输出与还原

      //定义一个普通数组有10行10列存储在指定位置存储1,2
       int[][] arr=new int[10][10];
       arr[1][3]=1;
       arr[2][5]=2;
       for (int[] ints : arr) {
           for (int anInt : ints) {
               System.out.print(anInt+"\t");
          }
           System.out.println();
      }

 

//创建一个稀疏数组,记录一下有多少个有效值使用sum
       int sum=0;
       for (int i = 0; i < arr.length; i++) {
           for (int j = 0; j < arr.length; j++) {
               if(arr[i][j]!=0){
                   sum++;
              }
          }
      }
       System.out.println("一共有"+sum+"个有效值");
       int[][] arr1=new int[sum+1][3];//sum+1就是它的行数,3为列数
       arr1[0][0]=arr.length;//稀疏数组用来存储行数
       arr1[0][1]=arr[0].length;//存储列数
       arr1[0][2]=sum;//有效个数
       //遍历稀疏数组将非零的值,存放到稀疏数组中
       int index=0;
       for (int i = 0; i < arr.length; i++) {
           for (int j = 0; j < arr[i].length; j++) {
               if(arr[i][j]!=0){
                   index++;
                   arr1[index][0]=i;
                   arr1[index][1]=j;
                   arr1[index][2]=arr[i][j];
              }
          }
      }
       System.out.println("输出稀疏数组:");
       for (int[] ints : arr1) {
           for (int anInt : ints) {
               System.out.print(anInt+"\t");
          }
           System.out.println();
      }

 

 System.out.println("还原稀疏数组");
       int[][] arr2=new int[arr1[0][0]][arr1[0][1]];
       for (int i = 1; i < arr1.length; i++) {
           arr2[arr1[i][0]][arr1[i][1]]=arr1[i][2];//相当与arr2[1][3]=1
      }
       for (int[] ints : arr2) {
           for (int anInt : ints) {
               System.out.print(anInt+"\t");
          }
           System.out.println();
      }
?