数据结构——稀疏数组

数据结构——稀疏数组

数据结构——稀疏数组

棋局存档问题:如何将一局五子棋保存下来,并实现读档

  • 利用稀疏数组进行数据保存,IO流写入/读取文件,实现读档。

数据结构——稀疏数组

简单代码实现:

/**
 * @author 萝卜
 * @date 2022/4/6
 * @dec 稀疏数组
 */
public class SparseArray {
    public static void main(String[] args) throws IOException {
        //棋盘大小
        int[][] arr = new int[11][11];

        //棋子布局,1为黑,2为白。
        arr[3][7] = 1;
        arr[2][6] = 2;
        arr[9][6] = 1;
        arr[1][3] = 2;
        arr[10][9] = 1;

        int count = 0;
        System.out.println("原数组为:");
        for (int[] ints : arr) {
            for (int anInt : ints) {
                System.out.printf("%d\t", anInt);
                if (anInt != 0) {
                    count++;
                }
            }
            System.out.println();
        }
        System.out.println();

        //实际数组-->稀疏数组
        int[][] arr2 = new int[count + 1][3];
        arr2[0][0] = arr.length;
        arr2[0][1] = arr[0].length;
        arr2[0][2] = count;

        count = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] != 0) {
                    count++;
                    arr2[count][0] = i;
                    arr2[count][1] = j;
                    arr2[count][2] = arr[i][j];
                }
            }
        }

        System.out.println("稀疏数组为:");
        for (int[] ints : arr2) {
            for (int anInt : ints) {
                System.out.printf("%d\t", anInt);
            }
            System.out.println();
        }
        System.out.println();

        //稀疏数组-->文件
        System.out.println("开始写出数据");
        OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("data.txt"));
        StringBuffer buff = new StringBuffer();
        boolean flag = false;
        for (int[] ints : arr2) {
            for (int anInt : ints) {
                if (flag) {
                    buff.append(",").append(anInt);
                } else {
                    buff.append(anInt);
                }
                flag = true;
            }
        }
        out.write(buff.toString());
        out.flush();
        out.close();
        System.out.println("输出数据为-->" + buff);
        System.out.println();

        System.out.println("开始还原数据");
        Scanner s = new Scanner(new FileInputStream("data.txt"));
        s.useDelimiter(",");

        //文件-->稀疏数组
        int[][] arr3 = new int[0][];
        while (s.hasNext()) {
            if (flag) {
                arr3 = new int[s.nextInt()][s.nextInt()];
                s.nextInt();
            } else {
                arr3[s.nextInt()][s.nextInt()] = s.nextInt();
            }
            flag = false;
        }

        //稀疏数组-->原数组
        for (int[] ints : arr2) {
            if (flag) {
                arr3[ints[0]][ints[1]] = ints[2];
            }
            flag = true;
        }

        System.out.println("稀疏数组还原为:");
        for (int[] ints : arr3) {
            for (int anInt : ints) {
                System.out.printf("%d\t", anInt);
            }
            System.out.println();
        }

    }
}

运行结果如下:

原数组为:
0   0   0   0   0   0   0   0   0   0   0
0   0   0   2   0   0   0   0   0   0   0
0   0   0   0   0   0   2   0   0   0   0
0   0   0   0   0   0   0   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   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   0   0
0   0   0   0   0   0   1   0   0   0   0
0   0   0   0   0   0   0   0   0   1   0

稀疏数组为:
11  11  5
1   3   2
2   6   2
3   7   1
9   6   1
10  9   1

开始写出数据
输出数据为-->11,11,5,1,3,2,2,6,2,3,7,1,9,6,1,10,9,1

开始还原数据
稀疏数组还原为:
0   0   0   0   0   0   0   0   0   0   0
0   0   0   2   0   0   0   0   0   0   0
0   0   0   0   0   0   2   0   0   0   0
0   0   0   0   0   0   0   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   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   0   0
0   0   0   0   0   0   1   0   0   0   0
0   0   0   0   0   0   0   0   0   1   0

Original: https://www.cnblogs.com/radish40/p/16106566.html
Author: 萝卜不会抛异常
Title: 数据结构——稀疏数组

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/594580/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 动态规划算法(DP,Dynamic Programming)

    动态规划算法(DP,Dynamic Programming) 文章目录 动态规划算法(DP,Dynamic Programming) 前言 一、递归到DP的一般转化方法 二、DP解…

    Java 2023年6月5日
    076
  • JAVA正则表达式:Pattern类与Matcher类详解(转)

    以下我们就分别来看看这两个类: 一、捕获组的概念 捕获组可以通过从左到右计算其开括号来编号,编号是从1 开始的。例如,在表达式 ((A)(B(C)))中,存在四个这样的组: 组零始…

    Java 2023年5月29日
    057
  • 对象存储

    注意事项:如果文件类型是图片,则使用MultipartFile类的对象,如MultipartFile file(比较推荐) 适用于流式文件传输,在上传图片,音/视频,文档等,都可采…

    Java 2023年6月13日
    073
  • 数组

    是一种用于存储 多个相同数据类型的存储模型 静态初始化 int [] arr = {1,8,12,3,5,9}; int arr2 [] = {1,8,12,3,5,9};//创建…

    Java 2023年6月8日
    083
  • Ubuntu 20.04 开启局域网唤醒(WoL)

    打开主板相关设置 创建 systemd 自启动设置文件 vim /etc/systemd/system/wol@.service 放入以下内容: [Unit] Descriptio…

    Java 2023年6月7日
    082
  • Hyper-V无法启动虚拟机因为虚拟机监控程序未运行

    Hyper-v无法启动虚拟机,因为虚拟机管理程序未运行 解决问题的大致思路 在任务管理器中查看cpu虚拟化是否开启虚拟化。 如果没有开启 重新启动电脑进入bios中找到Intel …

    Java 2023年5月30日
    0317
  • Kafka 基础概念及架构

    一、Kafka 介绍 Kafka是⼀个分布式、分区的、多副本的、多⽣产者、多订阅者,基于zookeeper协调的分布式⽇志系统(也可以当做MQ系统),常⻅可以⽤于web/nginx…

    Java 2023年6月5日
    089
  • mybatis insert返回主键的三种方式

    1.情景展示 我们知道,表与表之间的关联关系,通常使用主键,所以在处理复杂业务时,比如:按顺序插入多张表; 我们就需要在插入B表之间拿到插入A表后的主键,如何实现? 2.具体实现 …

    Java 2023年5月30日
    071
  • Java通过SSL忽略Certificate访问LDAP服务器【转】

    最近负责AD账户同步,遇到证书问题。 搜索后都说从AD服务器拿下证书,导入到java的cacerts中,尝试多次后无效。 绝望之际,看到 https://www.iteye.com…

    Java 2023年5月29日
    068
  • springboot整合gson打开swagger报错:Unable to render this definition。The provided definition does not specify a valid version field.

    The provided definition does not specify a valid version field. Please indicate a valid Sw…

    Java 2023年5月30日
    058
  • 你还在用BeanUtils进行对象属性拷贝?

    在做业务的时候,为了隔离变化,我们会将 DAO查询出来的 DO和对前端提供的 DTO隔离开来。大概 90%的时候,它们的结构都是类似的;但是我们很不喜欢写很多冗长的 b.setF1…

    Java 2023年6月6日
    067
  • 【leetcode】18. 四数之和

    题目 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c…

    Java 2023年6月6日
    071
  • GBase 8t索引

    索引时数据库提高数据查询处理性能的一个非常关键的技术,索引的使用可以对性能产生上百倍甚至上千倍的影响。接下来,会介绍索引的基本原理、概念,并深入学习数据库中所使用的索引结构和存储方…

    Java 2023年6月9日
    075
  • Linux服务器启动jstatd服务

    Linux,jstatd,Linux服务器启动jstatd服务 Linux服务器启动jstatd服务 1.查找jdk所在目录 2.在jdk的bin目录下创建文件jstatd.all…

    Java 2023年6月8日
    065
  • JVM类加载机制

    JVM类加载机制 JVM类加载机制分为:加载,验证,准备,解析,初始化五步,如 下图: 加载:这个阶段会在内存中生成一个代表这个类的java.lang.Class对象作为方法区这个…

    Java 2023年6月7日
    047
  • Redis分布式锁

    SETNX命令 将 key 的值设为 value,当且仅当 key 不存在。 若给定的 key 已经存在,则 SETNX 不做任何动作。SETNX 是SET if Not eXis…

    Java 2023年6月6日
    056
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球