一、应用场景

通过Java + 二维数组 + 稀疏数组实现一个五子棋盘功能,并且具有保存记忆功能。

二、实现原理

2.1 二维数组

大家都知道一维数组,不过一维数组的属于线性结构,而二维数组则属于非线性结构
线性结构特点

  • 线性结构是最常用的数据结构,其特点是数据元素之间存在一对一的线性关系
  • 线性结构有两种不同的存储结构,即 顺序存储结构( 数组)和 链式存储结构( 链表)
  • 顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的
  • 链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息
  • 线性结构常见的有: 数组、链表、队列、栈、堆、散列表等

非线性结构特点

  • 非线性结构是相对于线性结构的,最大的特点是一个数据元素可能多个前驱元素或多个后驱元素
  • 常用的非线性结构有二维数组,多维数组,广义表, 树结构,图结构等

一维数组创建

int oneArr[] = new int[11];

二维数组创建

int twoArr[][] = new int[11][11];

2.2 稀疏数组

  • 稀疏数组是一种特殊的二维数组,采用压缩技术,可以减少占用的空间,降低空间复杂度
  • 稀疏数组有多行,但只有三列,分别表示row(行)、col(列)、val(值),其中第一行比较特别,用来存放二维数组的行数,列数,有效值个数
  • 第二行后,存放二维数组的有效值的所在的行数、列数、值

三、思路分析

  • 创建原始一个二维数组
  • 将二维数组转稀疏数组
  • 将稀疏数组存到文件中
  • 从文件中读取数据到稀疏数组
  • 稀疏数组恢复为原始的二维数组

四、代码实现

  • 创建原始一个二维数组
    private static int[][] createTwoArr(int row, int col) {System.out.println("一、创建一个原始二维数组" + row + "*" + col);//0:表示没有棋子,1表示黑子,2表示蓝子int twoArr[][] = new int[row][col];twoArr[0][0] = 1;twoArr[1][1] = 2;twoArr[2][2] = 1;twoArr[3][3] = 2;//输出原始的二维数组for (int[] r : twoArr) {for (int data : r) {System.out.printf("%d\t", data);}System.out.println();}return twoArr;}
  • 将二维数组转稀疏数组
    private static int[][] chessArr2SparseArr(int[][] chessArr1) {System.out.println("二、将二维数组转稀疏数组");int sum = 0; //二维数组非0数据的个数//1.先遍历二维数组,得到非0数据的个数for (int i = 0; i < TWO_ARR_ROW; i++) {for (int j = 0; j < TWO_ARR_COL; j++) {if (chessArr1[i][j] != 0) {sum++;}}}//2.创建对应的稀疏数组int sparseArr[][] = new int[sum + 1][3];//给稀疏数组赋值sparseArr[0][0] = TWO_ARR_ROW;sparseArr[0][1] = TWO_ARR_COL;sparseArr[0][2] = sum;//遍历二维数组,将非0的值存放到稀疏数组中int count = 0; //用于记录是第几个非0数据for (int i = 0; i < TWO_ARR_ROW; i++) {for (int j = 0; j < TWO_ARR_COL; j++) {if (chessArr1[i][j] != 0) {count++;sparseArr[count][0] = i;sparseArr[count][1] = j;sparseArr[count][2] = chessArr1[i][j];}}}//输出稀疏数组的形式for (int i = 0; i < sparseArr.length; i++) {System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);}return sparseArr;}
  • 将稀疏数组存到文件中
    private static void sparseArrOutFile(File file, int[][] sparseArr) throws IOException {System.out.println("三、将稀疏数组存到文件中");FileOutputStream fos = new FileOutputStream(file);OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");for (int i = 0; i < sparseArr.length; i++) {//写入文件if (i == sparseArr.length - 1) {//最后一行,不用加分隔符","osw.append(sparseArr[i][0] + "," + sparseArr[i][1] + "," + sparseArr[i][2]);} else {osw.append(sparseArr[i][0] + "," + sparseArr[i][1] + "," + sparseArr[i][2] + ",");}}osw.close();fos.close();System.out.println(file.getAbsoluteFile());}
  • 从文件中读取数据到稀疏数组
    private static int[][] sparseArrInfile(File file) throws IOException {System.out.println("四、从文件中读取数据到稀疏数组");FileInputStream fis = new FileInputStream(file);InputStreamReader isr = new InputStreamReader(fis, "UTF-8");StringBuffer sb = new StringBuffer();while (isr.ready()) {sb.append((char) isr.read());}isr.close();fis.close();String[] str = sb.toString().split(",");int[][] sparseArrFf = new int[str.length / 3][3];int count = 0;for (String s : str) {sparseArrFf[count / 3][count % 3] = Integer.parseInt(s);count++;}//输出稀疏数组的形式for (int i = 0; i < sparseArrFf.length; i++) {System.out.printf("%d\t%d\t%d\t\n", sparseArrFf[i][0], sparseArrFf[i][1], sparseArrFf[i][2]);}return sparseArrFf;}
  • 稀疏数组恢复为原始的二维数组
    private static int[][] sparseArr2ChessArr(int[][] sparseArrFf) {System.out.println("五、稀疏数组恢复为原始的二维数组");//1.根据稀疏数组,创建原始的二维数组int chessArr2[][] = new int[sparseArrFf[0][0]][sparseArrFf[0][1]];//2.恢复稀疏的非空数据到原始二维数组中for (int i = 1; i < sparseArrFf.length; i++) {chessArr2[sparseArrFf[i][0]][sparseArrFf[i][1]] = sparseArrFf[i][2];}for (int[] row : chessArr2) {for (int data : row) {System.out.printf("%d\t", data);}System.out.println();}return chessArr2;}

五、完整代码

package com.justin.datastructures.nolinear.mularray.sparsearray;import java.io.*;/*** @program: DataStructures* @description: 使用二维数组、稀疏数组实现棋盘,并且保存记忆功能* @author: JustinQin* @create: 2021/6/27 15:19* @version: v1.0.0**/
public class ChessDemo {private static int TWO_ARR_ROW = 5; //二维数组行数private static int TWO_ARR_COL = 5; //二维数组列数public static void main(String[] args) throws IOException {//一、创建原始一个二维数组int chessArr1[][] = createTwoArr(TWO_ARR_ROW, TWO_ARR_ROW);//二、将二维数组转稀疏数组int sparseArr[][] = chessArr2SparseArr(chessArr1);//三、将稀疏数组存到文件中File file = new File("C:\\Users\\Administrator\\Desktop\\temp\\map.data");sparseArrOutFile(file, sparseArr);//四、从文件中读取数据到稀疏数组int[][] sparseArrFf = sparseArrInfile(file);//五、稀疏数组恢复为原始的二维数组int chessArr2[][] = sparseArr2ChessArr(sparseArrFf);}private static int[][] sparseArr2ChessArr(int[][] sparseArrFf) {System.out.println("五、稀疏数组恢复为原始的二维数组");//1.根据稀疏数组,创建原始的二维数组int chessArr2[][] = new int[sparseArrFf[0][0]][sparseArrFf[0][1]];//2.恢复稀疏的非空数据到原始二维数组中for (int i = 1; i < sparseArrFf.length; i++) {chessArr2[sparseArrFf[i][0]][sparseArrFf[i][1]] = sparseArrFf[i][2];}for (int[] row : chessArr2) {for (int data : row) {System.out.printf("%d\t", data);}System.out.println();}return chessArr2;}private static int[][] sparseArrInfile(File file) throws IOException {System.out.println("四、从文件中读取数据到稀疏数组");FileInputStream fis = new FileInputStream(file);InputStreamReader isr = new InputStreamReader(fis, "UTF-8");StringBuffer sb = new StringBuffer();while (isr.ready()) {sb.append((char) isr.read());}isr.close();fis.close();String[] str = sb.toString().split(",");int[][] sparseArrFf = new int[str.length / 3][3];int count = 0;for (String s : str) {sparseArrFf[count / 3][count % 3] = Integer.parseInt(s);count++;}//输出稀疏数组的形式for (int i = 0; i < sparseArrFf.length; i++) {System.out.printf("%d\t%d\t%d\t\n", sparseArrFf[i][0], sparseArrFf[i][1], sparseArrFf[i][2]);}return sparseArrFf;}private static void sparseArrOutFile(File file, int[][] sparseArr) throws IOException {System.out.println("三、将稀疏数组存到文件中");FileOutputStream fos = new FileOutputStream(file);OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");for (int i = 0; i < sparseArr.length; i++) {//写入文件if (i == sparseArr.length - 1) {//最后一行,不用加分隔符","osw.append(sparseArr[i][0] + "," + sparseArr[i][1] + "," + sparseArr[i][2]);} else {osw.append(sparseArr[i][0] + "," + sparseArr[i][1] + "," + sparseArr[i][2] + ",");}}osw.close();fos.close();System.out.println(file.getAbsoluteFile());}private static int[][] chessArr2SparseArr(int[][] chessArr1) {System.out.println("二、将二维数组转稀疏数组");int sum = 0; //二维数组非0数据的个数//1.先遍历二维数组,得到非0数据的个数for (int i = 0; i < TWO_ARR_ROW; i++) {for (int j = 0; j < TWO_ARR_COL; j++) {if (chessArr1[i][j] != 0) {sum++;}}}//2.创建对应的稀疏数组int sparseArr[][] = new int[sum + 1][3];//给稀疏数组赋值sparseArr[0][0] = TWO_ARR_ROW;sparseArr[0][1] = TWO_ARR_COL;sparseArr[0][2] = sum;//遍历二维数组,将非0的值存放到稀疏数组中int count = 0; //用于记录是第几个非0数据for (int i = 0; i < TWO_ARR_ROW; i++) {for (int j = 0; j < TWO_ARR_COL; j++) {if (chessArr1[i][j] != 0) {count++;sparseArr[count][0] = i;sparseArr[count][1] = j;sparseArr[count][2] = chessArr1[i][j];}}}//输出稀疏数组的形式for (int i = 0; i < sparseArr.length; i++) {System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);}return sparseArr;}private static int[][] createTwoArr(int row, int col) {System.out.println("一、创建一个原始二维数组" + row + "*" + col);//0:表示没有棋子,1表示黑子,2表示蓝子int twoArr[][] = new int[row][col];twoArr[0][0] = 1;twoArr[1][1] = 2;twoArr[2][2] = 1;twoArr[3][3] = 2;//输出原始的二维数组for (int[] r : twoArr) {for (int data : r) {System.out.printf("%d\t", data);}System.out.println();}return twoArr;}
}

运行测试类,输出结果如下:
一、创建一个原始二维数组5*5
1 0 0 0 0
0 2 0 0 0
0 0 1 0 0
0 0 0 2 0
0 0 0 0 0
二、将二维数组转稀疏数组
5 5 4
0 0 1
1 1 2
2 2 1
3 3 2
三、将稀疏数组存到文件中
C:\Users\Administrator\Desktop\temp\map.data
四、从文件中读取数据到稀疏数组
5 5 4
0 0 1
1 1 2
2 2 1
3 3 2
五、稀疏数组恢复为原始的二维数组
1 0 0 0 0
0 2 0 0 0
0 0 1 0 0
0 0 0 2 0
0 0 0 0 0

数组--如何通过【二维数组+稀疏数组】实现五子棋盘,并且保存记忆功能?相关推荐

  1. js 一维数组转换成二维、三维数组

    需求:后台接口返回一个一维数组,前端需要转换成一个二维,或者三维数组进行级联展示 举个例子: 根据产品类型可以分为:智能手机.耳机.智能家电... 其中智能手机中又可以分为: Ace系列,Reno系列 ...

  2. BZOJ.2738.矩阵乘法(整体二分 二维树状数组)

    题目链接 BZOJ 洛谷 整体二分.把求序列第K小的树状数组改成二维树状数组就行了. 初始答案区间有点大,离散化一下. 因为这题是一开始给点,之后询问,so可以先处理该区间值在l~mid的修改,再处理 ...

  3. 二维树状数组 ----2021广东省赛 ----- K - Kera‘s line segment[区间转二维平面+树状数组维护前缀最小最大值]

    题目链接 题目大意: 就是一个一维的数轴上面有一堆线段用一个三元组(l,r,val)(l,r,val)(l,r,val)表示. 现在我们有两个操作: 就是往数轴上面添加线段 询问[L,R][L,R][ ...

  4. szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】

    树状数组(Binary Index Tree) 树状数组可以解决可以转化为前缀和问题的问题 这是一类用以解决动态前缀和的问题 (有点像线段树简版) 1.对于 a1 + a2 + a3 + - + an ...

  5. linux c语言 malloc动态分配指针,C语言malloc函数为一维,二维,三维数组分配空间...

    c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区.可以根据需要,向系统申请 ...

  6. 【二维树状数组】See you~

    https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/F [题意] 给定一个矩阵,每个格子的初始值为1.现在可以对矩阵有四种操作: A ...

  7. POJ_1195 Mobile phones 【二维树状数组】

    题目链接:http://poj.org/problem?id=1195 纯纯的二维树状数组,不解释,仅仅须要注意一点,由于题目中的数组从0開始计算,所以维护的时候须要加1.由于树状数组的下标是不能为1 ...

  8. java ArrayList 套数组,二维不等长数组

    ArrayList 除了装填普通类型外,还能为数组类型.用法是: ArrayList<ArrayList<Double>> arr = new ArrayList<> ...

  9. 【C 语言】数组 ( 一维数组形参退化 | 二维数组形参退化 | 函数形参等价关系 )

    文章目录 一.一维数组形参退化 二.二维数组形参退化 三.数组形参等价关系 一.一维数组形参退化 C 中将 一维数组 作为参数 , 传递到函数中 , 该 一维数组 会退化为 指针 ; 将 int ar ...

最新文章

  1. MySQL 5.1 安装过程中报apply security setting错误的解决办法 收藏
  2. 前端学习(1057):面向对象目标
  3. 06-图1 列出连通集
  4. weblogic在处理jsp tag的scope属性时的BUG???
  5. PHP设计模式之建造者模式
  6. Apache Server Status主机状态查看
  7. Java家庭收支记账系统
  8. 数据流分析之WorkList Algorithm
  9. 2022年使用的最佳Javascript库
  10. linux核显显示独显内容,Linux驱动显示Intel第12代核显新特性:显示状态缓存
  11. 脚本重启电信天翼网关
  12. Cousera - Deep Learning - 课程笔记 - Week 5
  13. vs将项目发布到服务器,vs2010将项目发布到远程服务器上
  14. Matlab中关于数值积分及符号积分的讨论
  15. let和const与var的区别
  16. 关于onCreate(Bundle savedInstanceState, PersistableBundle persistentState)
  17. CIDEr 评价指标
  18. 饥饿营销:如果世界末日来临,你愿意为我抢一件优衣库kwas联名款吗?
  19. python的Panda3D库如何安装使用以及用途
  20. 删除U盘中的System Volume Information 文件夹的方法

热门文章

  1. 中兴智能视觉大数据报道:人脸识别厉害的还在后头!
  2. Activiti初识篇
  3. Sonatype Nexus Repository Manager OSS仓库管理私服(一)——搭建私服
  4. 如何给自选股票分组_自选股,同花顺自选股怎么分组就是,自选股 把自
  5. 猎头术语:Delimited Search
  6. 巧用微服务进行大数据量计算
  7. 芯生美电子发布两款100V耐压的DC-DC降压芯片CSM3820SG/CSM3100SK
  8. 如何做一个基于微信汽车维修保养小程序系统毕业设计毕设作品
  9. 2.3.5 linux软件管理 :debian和RedHat体系常用软件安装: axel 安装
  10. 【tvm】——tvm编译与安装