稀疏数组分析

稀疏数组

一、稀疏数组定义:

​ 稀疏数组是一种二维数组。当在二维数组中存在较多的无效值如0的时候,我们可以考虑采用稀疏数组以节省空间。

二、需求:

解决二维数组很多默认值0

三、处理方式:

  1. 记录数组一共有几行几列,有多少个不同值
  2. 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模.

四、案例:

1.解决棋盘退出保存问题

0:表示没有棋子 1:表示黑棋 2:表示白棋

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cEi7Ta3k-1666435091451)(C:\Users\hp\Desktop\稀疏数组的照片\QQ截图20221022181635.png)]

public class StudySparseArray {
  public static void main(String[] args) {
      //打印棋盘 0:表示没有棋子 1:表示黑棋 2:表示白棋
      int[][] arr = new int[8][8];
      //给二维数组arr赋值
      arr[0][2] = 1;
      arr[2][1] = 2;
      arr[3][1] = 1;
      arr[3][2] = 2;
      System.out.println("棋盘: ");
      print(arr);//调用print方法来答应结果
      int sum = 0;//用来记录有多少个有效值,为了后面来确定稀疏数组的行数
      for (int i = 0; i < arr.length; i++) {//对数组arr的行来进行循环遍历
          for (int j = 0; j < arr[i].length; j++) {//对arr行的每列值进行循环遍历
              if (arr[i][j] != 0){//如果值不等于0,sum进行加1,
                  sum++;//为了后面记录稀疏数组的行数
              }
          }
      }
      System.out.println("有效值sum: " + sum);
      System.out.println("===================");
      System.out.println("稀疏数组: ");
      //稀疏数组
      int[][] arr1 = new int[sum+1][3];//因为稀疏数组的第一行是来记录总体的行列及值的个数,所以sum+1
      arr1[0][0] = 8;//给第一行的值进行赋值
      arr1[0][1] = 8;
      arr1[0][2] = sum;
      int count = 0;
      for (int i = 0; i < arr.length;i++){//循环数组arr的行数
          for (int j = 0; j < arr[i].length; j++) {//循环数组arr的列数;
              if (arr[i][j]  != 0){
                  count++;//因为稀疏数组是每个值为一行,所以可以用count来为稀疏数组添加值!
                  arr1[count][0] = i;//记录了该值在二维数组的第几行
                  arr1[count][1] = j;//记录了该值在二维数组的第几列
                  arr1[count][2] = arr[i][j];//记录了该值有效值是多少
              }
          }
      }
      print(arr1);
      System.out.println("========================");
      System.out.println("还原稀疏数组: ");
      int[][] arr2 = new int[arr1[0][0]][arr1[0][1]];
      for (int i = 1; i < arr1.length; i++) {//因为稀疏数组的第一行记录的值是表的总行数跟列数,第二行开始才记录的是有效值的行数,列数,以及值是多少;
                                             //如果是0 就会报错(数组下标指针溢出异常):因为我们创建的arr2数组行和列都是8,且arr1[0][0]=8
                                             // arr1[0][1]=8,arr2[arr1[i][0]][arr1[i][1]]=arr2[8][8],这个代表着arr2第9行第9列
                                             //数组的下标是从0开始的,所以会出现指针溢出异常!
          arr2[arr1[i][0]][arr1[i][1]] = arr1[i][2];
      }
      print(arr2);
  }
  
  //用二维数组的foreach来遍历打印该数组
  public static void print(int[][] arr){
      for (int[] ints : arr){
          for (int anInt : ints){
              System.out.print(anInt + "\t");
          }
          System.out.println();
      }
  }
}

2.结果图

     }
        System.out.println();
    }
}

}


### 2.结果图

![在这里插入图片描述](https://img-blog.csdnimg.cn/08a5b7443d1749bf817a89eccaaadf59.png#pic_center)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值