稀疏数组Sparse Array

一、实际需求

五子棋是一种双人对弈的策略性棋类游戏,在我们用Java编写五子棋程序时,我们会设法实现存盘退出续上盘这样的一些功能。存盘退出,实际上就是要求我们对当前的棋盘进行记录并且写入到文件里面,这样选择续上盘的功能时才能从文件当中读档,恢复到上次保存的棋局当中。

我们在存储如左图所示的棋盘时,通常会选择一个二维数组,如右图所示。但是在大多数情况下该二维数组的很多值是默认值0,这样在无形当中就记录了很多没有意义的数据。这时可以采用稀疏数组,减少数据的存储量,设法不去存储默认值。

二、基本介绍

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

稀疏数组的处理方法是:

  1. 记录二维数组一共有几行几列,有多少个不同位置的元素;
  2. 把不同的元素的行列及值记录在一个小规模的数组(即稀疏数组)中,从而缩小程序的规模。

下面简单地举例说明:

左图是一个二维数组的矩阵表示,右图是将二维数组转换成的稀疏数组。

三、应用实例

  1. 使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)
  2. 把稀疏数组存盘,并且可以重新恢复原来的二维数组
  3. 整体思路分析

4. 代码实现

四、课后练习

要求

  1. 在前面的基础上,将稀疏数组保存到磁盘上,比如map.data
  2. 恢复原来的数组时,读取map.data进行恢复

代码

package linerStructures;import java.io.*;
import java.util.ArrayList;
import java.util.List;public class sparseArray {public static void main(String args[]){int chessArray1[][]=new int [11][11];  //创建一个二维数组表示初始棋盘chessArray1[1][2]=1;  //用 1 表示棋盘上的黑子chessArray1[2][3]=2;  //用 2 表示棋盘上的蓝子//输出棋盘
//        for(int[] row:chessArray1){
//            for(int data:row){
//                System.out.printf("%d\t",data);
//            }
//            System.out.println();
//        }//将二维数组 转 稀疏数组//1、 先遍历 二维数组,得到非 0 数据的个数,用于创建 稀疏数组//   二维数组 转 稀疏数组的思路//   1) 遍历原始的二维数组,得到有效数据的个数 sum//   2) 根据sum 就可以创建 稀疏数组 sparseArr   int[sum + 1] [3]//   3) 将二维数组的有效数据数据存入到 稀疏数组int num=0; //记录数据的个数for(int i=0;i<chessArray1.length;i++){for(int j=0;j<chessArray1[0].length;j++){if(chessArray1[i][j]!=0){num++;}}}//2、 接着创建一个 稀疏数组int sparseArray1[][]=new int [num+1][3]; //建立一个num+1行,2列的 稀疏数组sparseArray1[0][0]=11;//第一行记录 二维数组 的行列以及数据的个数sparseArray1[0][1]=11;sparseArray1[0][2]=num;//3、 取得非 0 位置的值int count=0;for(int i=0;i<chessArray1.length;i++){for(int j=0;j<chessArray1[0].length;j++){if(chessArray1[i][j]!=0){sparseArray1[count+1][0]=i;sparseArray1[count+1][1]=j;sparseArray1[count+1][2]=chessArray1[i][j];count++;}}}//4、 输出 稀疏数组
//        for(int i=0;i<sparseArray1.length;i++){
//            System.out.printf("%d\t%d\t%d\n",sparseArray1[i][0],sparseArray1[i][1],sparseArray1[i][2]);
//        }//5、 将 稀疏数组 恢复成 二维数组//    稀疏数组转原始的二维数组的思路//    1) 先读取稀疏数组的第一行,根据第一行的数据,//       创建原始的二维数组,比如上面的  chessArr2 = int [11][11]//    2) 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.int row=sparseArray1[0][0],col=sparseArray1[0][1];int chessArray2[][]=new int[row][col];  //重新创建一个二维数组for(int i=1;i<sparseArray1.length;i++){//稀疏数组每一行的第一列是二维数组里的行号,第二列是列号,第三列是数据chessArray2[sparseArray1[i][0]][sparseArray1[i][1]]=sparseArray1[i][2];}
//        for(int[] r:chessArray2){
//            for(int data:r){
//                System.out.printf("%d\t",data);
//            }
//            System.out.println();
//        }//6、 练习题 :将稀疏数组输出到文件当中 然后再从文件中读取并恢复二维数组try{String string=new String("sparseArray.txt");FileWriter fw=new FileWriter(string);for(int[] row1:sparseArray1) {for (int data : row1) {fw.write(data+"\t");}}fw.close();}catch(IOException e){e.printStackTrace();}try {List<Integer> l=new ArrayList<>();String string=new String("sparseArray.txt");File f=new File(string);BufferedReader br=new BufferedReader(new FileReader(f));
//            String s=br.readLine();
//            System.out.println(s);
//            String[] numbers=s.split("\t");
//            System.out.println(numbers[3]);  //用来检查错误的代码String s=null;while((s=br.readLine())!=null){String[] sn=s.split("\t");for(String sc:sn) {int i = Integer.parseInt(sc);l.add(i);}}int r=l.get(0),c=l.get(1);int chessArray3[][]=new int[r][c];  //重新创建一个二维数组for(int i=3;i<l.size();i++){//稀疏数组每一行的第一列是二维数组里的行号,第二列是列号,第三列是数据if(i%3==0) chessArray3[l.get(i)][l.get(i+1)]=l.get(i+2);}for(int[] three:chessArray3) {for (int data : three) {System.out.printf("%d\t", data);}System.out.println();}br.close();}catch (IOException e){e.printStackTrace();}}
}

笔记

split()函数报错:读取文件的时候,分割从文件当中读到的一整行数据,忘记写文件的时候用的分隔符是‘\t’。所以一直在用空格去分割,自然得不到正确的结果。

参考资料

[1] 尚硅谷-韩顺平 Java数据结构和算法课件

Java数据结构:稀疏数组(Sparse Array)的创建和文件存取相关推荐

  1. JAVA数据结构-稀疏数组

    稀疏数组 什么是稀疏数组? 假设有这样的一个二维数组 shape是11x11,但是很多数据都是0,比较浪费空间,我们可以通过一些方法来压缩这个数组,稀疏数组就是一种压缩数组的方法,通过稀疏数组变换后, ...

  2. 数据结构与算法--稀松数组(Sparse Array)

    此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.概述 需要强调的是,稀松数组适用于二维数组中大部分数据具有相同的值的情 ...

  3. 【JavaSE_06】Java中的数组(array)

    #1.什么是数组? 顾名思义,即为数据的组合或集合,数组就是用来表示一组数据的. 比如没有数组之前,我们要存储多个姓名的信息 String name1; String name2; String na ...

  4. java数据结构之数组

    数据结构对我们的程序员也是非常重要的,相当于一个基础学科,从今天开始,咱们再重新学习一下数据结构吧 1,首先我们要定义一下泛型,初始化成员变量,声明构造方法. private T data[];pri ...

  5. Java中的数组(Array)

    1.什么是数组 数组(array)是一种用于存储多个相同类型数据的存储模型 2.数组定义格式 第一种:数据类型[] 数组名 ​示例: int[] arr; double[] arr; char[] a ...

  6. 【JavaSE_06】Java中的数组(array)-提高练习

    #1.求1!+2!+3!+···+30!的和,定义一个方法 public class Test1{public static void main(String[] args){//1.求1!+2!+3 ...

  7. Java数据结构与算法———(55)创建一个哈希表

    有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址-),当输入该员工的id时,要求查找到该员工的 所有信息.要求: 不使用数据库,尽量节省内存,速度越快越好=>哈希 ...

  8. 【JavaSE_06】Java中的数组(array)-练习

    (1),数组的两种遍历方式,顺序查找,二分查找,求最大最小数,冒泡排序,选择排序. public class Test1{public static void main(String[] args){ ...

  9. Java数据结构-基于数组的栈和泛型

    泛型可以参数化变量的类型 当你需要用不同类型的基本类型变量来调用构造方法时你需要泛型 public class Test {public static void main(String[] args) ...

  10. 【浅刷Java数据结构】Leetcode 606 根据二叉树创建字符串

    链接: Leetcode 606 根据二叉树创建字符串 整体思路: 题目要求按照前序遍历的方式遍历.(根(左子树)(右子树)) 根为空直接返回. 根不为空时:看左右子树是否空,就可以分类讨论: 左树为 ...

最新文章

  1. Keil 5出现Error: L6218E: Undefined symbol解决方法
  2. 常见的10道Web前端面试题及答案分享!
  3. 云计算十年 腾讯新一代企业安全助力云化之路
  4. 运用python的方式_六、python 方法的使用
  5. Java中父类的静态变量和静态方法的继承问题
  6. python中tkinter的使用-中
  7. linq判断集合中相同元素个数_java----Collection集合常用方法
  8. c 本地html解析,使用selenium解析本地HTML文件方法
  9. C/C++ sizeof(上)
  10. 搭建BP神经网络(完整代码快速上手)
  11. laravel 5.2 异常处理页面
  12. ssh反向代理实现内网穿透;ssh+nginx实现公网云服务器代理访问内网服务器
  13. 电脑安装不上chrome浏览器
  14. [转]深度学习在目标跟踪中的应用
  15. python webkit内核_360浏览器使用meta标签强制使用指定webkit内核 - meta强制用极速模式...
  16. mac下图片CR2格式转换成JPG格式
  17. 中国幽门螺杆菌感染研究进展
  18. 一个屌丝程序员的青春(三九六)
  19. -R语言中%in%函数的用法
  20. tec控制pid程序_如何设计TEC 温度环路 PID 控制电路?这个方法告诉你

热门文章

  1. VMware vSphere client 5.1登录出现这个错误:客户端无法向服务器发送完整请求
  2. WebGL 3D on iOS8 正式版
  3. 电脑今天关机,第二天重启 解决方案
  4. verilog语法学习心得
  5. jquery和prototype冲突解决
  6. mac终端支持git
  7. 前端页面因为过滤器出现路径不正确,css效果不展示
  8. 什么是接口?接口的定义和使用
  9. java架构师_阿里P8架构师分享:想成为Java架构师,必须掌握的几点技术
  10. mysql5.7.17启动失败_解决Mysql5.7.17在windows下安装启动时提示不成功问题