Java数据结构:稀疏数组(Sparse Array)的创建和文件存取
稀疏数组Sparse Array
一、实际需求
五子棋是一种双人对弈的策略性棋类游戏,在我们用Java编写五子棋程序时,我们会设法实现存盘退出和续上盘这样的一些功能。存盘退出,实际上就是要求我们对当前的棋盘进行记录并且写入到文件里面,这样选择续上盘的功能时才能从文件当中读档,恢复到上次保存的棋局当中。
我们在存储如左图所示的棋盘时,通常会选择一个二维数组,如右图所示。但是在大多数情况下该二维数组的很多值是默认值0,这样在无形当中就记录了很多没有意义的数据。这时可以采用稀疏数组,减少数据的存储量,设法不去存储默认值。
二、基本介绍
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法是:
- 记录二维数组一共有几行几列,有多少个不同位置的元素;
- 把不同的元素的行列及值记录在一个小规模的数组(即稀疏数组)中,从而缩小程序的规模。
下面简单地举例说明:
左图是一个二维数组的矩阵表示,右图是将二维数组转换成的稀疏数组。
三、应用实例
- 使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)
- 把稀疏数组存盘,并且可以重新恢复原来的二维数组
- 整体思路分析
4. 代码实现
四、课后练习
要求
- 在前面的基础上,将稀疏数组保存到磁盘上,比如map.data
- 恢复原来的数组时,读取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)的创建和文件存取相关推荐
- JAVA数据结构-稀疏数组
稀疏数组 什么是稀疏数组? 假设有这样的一个二维数组 shape是11x11,但是很多数据都是0,比较浪费空间,我们可以通过一些方法来压缩这个数组,稀疏数组就是一种压缩数组的方法,通过稀疏数组变换后, ...
- 数据结构与算法--稀松数组(Sparse Array)
此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.概述 需要强调的是,稀松数组适用于二维数组中大部分数据具有相同的值的情 ...
- 【JavaSE_06】Java中的数组(array)
#1.什么是数组? 顾名思义,即为数据的组合或集合,数组就是用来表示一组数据的. 比如没有数组之前,我们要存储多个姓名的信息 String name1; String name2; String na ...
- java数据结构之数组
数据结构对我们的程序员也是非常重要的,相当于一个基础学科,从今天开始,咱们再重新学习一下数据结构吧 1,首先我们要定义一下泛型,初始化成员变量,声明构造方法. private T data[];pri ...
- Java中的数组(Array)
1.什么是数组 数组(array)是一种用于存储多个相同类型数据的存储模型 2.数组定义格式 第一种:数据类型[] 数组名 示例: int[] arr; double[] arr; char[] a ...
- 【JavaSE_06】Java中的数组(array)-提高练习
#1.求1!+2!+3!+···+30!的和,定义一个方法 public class Test1{public static void main(String[] args){//1.求1!+2!+3 ...
- Java数据结构与算法———(55)创建一个哈希表
有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址-),当输入该员工的id时,要求查找到该员工的 所有信息.要求: 不使用数据库,尽量节省内存,速度越快越好=>哈希 ...
- 【JavaSE_06】Java中的数组(array)-练习
(1),数组的两种遍历方式,顺序查找,二分查找,求最大最小数,冒泡排序,选择排序. public class Test1{public static void main(String[] args){ ...
- Java数据结构-基于数组的栈和泛型
泛型可以参数化变量的类型 当你需要用不同类型的基本类型变量来调用构造方法时你需要泛型 public class Test {public static void main(String[] args) ...
- 【浅刷Java数据结构】Leetcode 606 根据二叉树创建字符串
链接: Leetcode 606 根据二叉树创建字符串 整体思路: 题目要求按照前序遍历的方式遍历.(根(左子树)(右子树)) 根为空直接返回. 根不为空时:看左右子树是否空,就可以分类讨论: 左树为 ...
最新文章
- Keil 5出现Error: L6218E: Undefined symbol解决方法
- 常见的10道Web前端面试题及答案分享!
- 云计算十年 腾讯新一代企业安全助力云化之路
- 运用python的方式_六、python 方法的使用
- Java中父类的静态变量和静态方法的继承问题
- python中tkinter的使用-中
- linq判断集合中相同元素个数_java----Collection集合常用方法
- c 本地html解析,使用selenium解析本地HTML文件方法
- C/C++ sizeof(上)
- 搭建BP神经网络(完整代码快速上手)
- laravel 5.2 异常处理页面
- ssh反向代理实现内网穿透;ssh+nginx实现公网云服务器代理访问内网服务器
- 电脑安装不上chrome浏览器
- [转]深度学习在目标跟踪中的应用
- python webkit内核_360浏览器使用meta标签强制使用指定webkit内核 - meta强制用极速模式...
- mac下图片CR2格式转换成JPG格式
- 中国幽门螺杆菌感染研究进展
- 一个屌丝程序员的青春(三九六)
- -R语言中%in%函数的用法
- tec控制pid程序_如何设计TEC 温度环路 PID 控制电路?这个方法告诉你
热门文章
- VMware vSphere client 5.1登录出现这个错误:客户端无法向服务器发送完整请求
- WebGL 3D on iOS8 正式版
- 电脑今天关机,第二天重启 解决方案
- verilog语法学习心得
- jquery和prototype冲突解决
- mac终端支持git
- 前端页面因为过滤器出现路径不正确,css效果不展示
- 什么是接口?接口的定义和使用
- java架构师_阿里P8架构师分享:想成为Java架构师,必须掌握的几点技术
- mysql5.7.17启动失败_解决Mysql5.7.17在windows下安装启动时提示不成功问题