【数据结构】稀疏数组
稀疏数组保存五子棋棋盘
思路:二维数组模拟棋盘 --->稀疏数组--->序列化到文件中保存--->反序列化得到稀疏数组--->还原二维数组
对象序列化需要实现Serializable接口。要是是我们定义的对象那好办,直接在类的后面加一句implements Serializable就可以了。思路是定义一个类,然后定义一个二维数组的属性,然后操作这个类。
但是,在一开始我正愁没有类让我去实现接口,于是我尝试着直接去序列化了数组,操作居然成功了,这就很神奇,至于为什么暂时不清楚。总之需求已经完成了。看代码:
import java.io.*;
import java.util.Arrays;/*** 稀疏数组保存五子棋棋盘* 思路:二维数组 --->稀疏数组--->还原二维数组*/
public class SparseArray {public static void main(String[] args) {// 定义一个11*11 的五子棋棋盘int chessArr1[][] = new int[11][11];//初始化二维数组,赋几个值。相当于这时下了几步棋,保存棋局,下次再继续下。chessArr1[1][2] = 1;chessArr1[2][2] = 2;chessArr1[3][2] = 1;//遍历打印二维数组看下效果,降维。每个一维数组的元素就是一个一维数组for (int[] rows : chessArr1) {//把当前元素(是一个一维数组)遍历打印for (int row : rows) {System.out.printf("%d\t",row);}//换一行System.out.println();}//转稀疏数组,先定义一个稀疏数组//3列,行数为:有效数据 + 1int sum = 0;for (int i = 0; i < chessArr1.length; i++) {for (int j = 0; j < chessArr1.length; j++) {if (chessArr1[i][j] != 0){sum++;}}}//System.out.println(sum);int [][] sparseArr = new int[sum + 1][3];//初始化该稀疏数组sparseArr[0][0] = chessArr1.length;sparseArr[0][1] = chessArr1.length;sparseArr[0][2] = sum;int count = 0;for (int i = 0; i < chessArr1.length; i++) {for (int j = 0; j < chessArr1.length; j++) {if (chessArr1[i][j] != 0){count++;sparseArr[count][0] = i;sparseArr[count][1] = j;sparseArr[count][2] = chessArr1[i][j];}}}//把稀疏数组打印出来康康System.out.println("得到的稀疏数组:");for (int[] rows : sparseArr) {for (int row : rows) {System.out.printf("%d\t",row);}System.out.println();}//序列化,保存文件try {ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\code\\DataStructuresAndAlgorithms\\DataStructures\\src\\chess.dat"));oos.writeObject(sparseArr);oos.close();} catch (IOException e) {throw new RuntimeException(e);}//反序列化int[][] sparseArr2 = null;try {ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\code\\DataStructuresAndAlgorithms\\DataStructures\\src\\chess.dat"));sparseArr2 = (int[][]) ois.readObject();ois.close();System.out.println("====反序列化还原的稀疏数组=====");System.out.println(Arrays.deepToString(sparseArr2));} catch (Exception e) {throw new RuntimeException(e);}//根据稀疏数组还原二维数组int[][] chessArr2 = new int[sparseArr2[0][0]][sparseArr2[0][1]];//注意,i 从1开始,而不是从0开始。for (int i = 1; i < sparseArr2.length; i++) {//稀疏数组的列和列的含义是固定的,因此我们用一层遍历行即可还原//列的含义:第一列,元素所在二维数组的行;第二列,元素所在二维数组的类;第三列,元素所在二维数组的值。chessArr2[sparseArr2[i][0]][sparseArr2[i][1]] = sparseArr2[i][2];}//把还原后的二位数组打印出来看看:System.out.println("恢复后的二维数组:");for (int[] rows : chessArr2) {for (int row : rows) {System.out.printf("%d\t",row);}System.out.println();}}}
运行截图:
【数据结构】稀疏数组相关推荐
- JAVA数据结构-稀疏数组
稀疏数组 什么是稀疏数组? 假设有这样的一个二维数组 shape是11x11,但是很多数据都是0,比较浪费空间,我们可以通过一些方法来压缩这个数组,稀疏数组就是一种压缩数组的方法,通过稀疏数组变换后, ...
- 数据结构与算法---稀疏数组
数据结构与算法-稀疏数组 1.基本介绍: 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 2.稀疏数组的处理方法是: (1)记录数组一共有几行几列,有多少个 ...
- 数据结构(一)--稀疏数组
数据结构复习笔记(一)–稀疏数组 介绍 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵. 如: 0 0 0 0 0 0 0 0 0 0 0 0 ...
- 稀疏数组(数据结构)
稀疏数组(数据结构) 需求:编写五子棋游戏中,有存盘和续上盘的功能 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ...
- 数据结构与算法————稀疏数组
引言 数据压缩方面,我们往往可以通过稀疏数组来保存有效数据,节省存储空间. 一.稀疏数组的概念 当一个数组中大部分元素是0,或为同一个值的时候,可以使用稀疏数组来保存数组. 它是一个十分有效的存储结构 ...
- 【Java数据结构与算法】第一章 稀疏数组和队列
第一章 稀疏数组和队列 文章目录 第一章 稀疏数组和队列 一.线性结构和非线性结构 1.线性结构 2.非线性结构 二.稀疏数组 三.队列 1.队列 2.环形队列 一.线性结构和非线性结构 1.线性结构 ...
- 稀疏数组练习demo 数据结构和算法
稀疏数组课后练习demo 数据结构和算法 实现了二维数组转稀疏数组保存到文件,读文件再转为二维数组 import java.io.*; import java.util.Arrays;/*** htt ...
- 数据结构与算法一:稀疏数组 队列 链表
1 线性结构和非线性结构 数据结构包括:线性结构和非线性结构. 1.1 线性结构 线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系 线性结构有两种不同的存储结构,即顺序存储结构和 ...
- 尚硅谷01 数据结构与算法_数据结构与算法介绍+稀疏数组
数据结构与算法的关系 几个实际编程中遇到的问题 要想写出优秀的算法,首先应该能读懂别人写好的算法. 将生活中遇到的实际问题,使用程序来解决 线性结构和非线性结构 线性结构和非线性结构的关系: 数据结构 ...
- 菜鸟窝-数据结构与算法之稀疏数组
数据结构与算法 数据结构是组织(包括存储.处理等)数据的方式,是算法的基础 程序=数据结构+算法:数据结构分为线性和非线性 五子棋问题.约瑟夫问题等都离不开数据结构与算法 常用算法案例:修路问题.最短 ...
最新文章
- 规模化敏捷框架(SAFe)的原则
- java redis使用卡死_jedispool连redis高并发卡死的问题
- SwinTransformer代码中出现的代码知识的学习
- java 生成 tar.gz_一文教您如何通过 Java 压缩文件,打包一个 tar.gz Filebeat 采集器包...
- matlab 按一定概率取数组中的值
- linux gcc 简单使用记录01
- MVC3 URL 数据绑定
- 指针和引用的区别和联系
- liunx系统优化之 TCP sysctl
- js获取本地文件夹和文件 .
- VMware虚拟化技术培训(6) 虚拟网络和虚拟存储
- 网络游戏植入营销案例
- 计算机功能自定义,电脑鼠标自定义按键设置方法
- 场景法、流程分析法、错误推断法
- 取消idm浏览网页时的自动下载
- WorldS4 2020 | 联邦学习的个性化技术综述
- 单元测试--学习大纲
- Android开发技术学习之下拉刷新功能的实现
- vue的entries和nextTick
- Tengine全面支持寒武纪思元芯片平台,共同推进AI芯片加速之路
热门文章
- Day241242.单点登录方案【Jwt令牌、sessionredis、CAS认证服务器】 -springsecurity-jwt-oauth2
- 给学弟学妹肝的一篇Java学习路线,保证学弟学妹们大三大四的时候顺利找到实习 Offer
- 6.9对一个工作簿中的所有工作表分别求和并将求和结果写入固定单元格
- 推荐几个2020年最实用的网站!
- 免安装mysql8.0
- VMware Workstation 15 Pro 安装centos7
- web项目上云_联想Filez—携手浙江中烟,发力“云”端,打造“烟草上云”新势能...
- 哈佛大学砸场子:DALL-E 2只是「粘合怪」,生成正确率只有22%
- 关于销售订单挑库发放卡接口以及发运处理卡接口的处理方式
- ZYNQ学习笔记PS部分【基本介绍】