文章目录

  • 背景
  • 场景
  • 假代码实现
  • 真代码实现

背景

玩了几十年了。该还的还是要还。懂的人自然懂,不懂的自然不懂。如果你与我一样浪费了几十年青春,欢迎和我一起努力并交流,什么是生活。
仅仅是敲代码,不分操作系统和环境之类的,这里就不提及了。

场景

棋盘的保存于恢复,纵横11路的棋盘,想象成二维数组。进行压缩保存。

假代码实现

  1. 声明稀疏结构体
  2. 创建棋盘原型数组
  3. 转换成稀疏数组(就是压缩数据)
    1. 第一组数据是棋盘范围,也就是数组范围:11 11 0
    2. 遍历原型数组,不是0的值就存起来。达到压缩效果
    3. 将第一行的棋盘范围数据和原型数组非0(代码下了期,有了数据)的值存到一个变量存起来
  4. 写入文件
    1. 先判断是否有这个文件
    2. 如果有不再新建文件
    3. 如果没有就创建并写入稀疏数组内容
  5. 读取文件
    1. 打开文件
    2. 通过缓存方式读取
    3. 按行(\n)读取;此时一行内容读取出来只是一个string类型,是一个整体
    4. 按照特定字符进行切割;将一行内容切割,得到每个元素
    5. 按照顺序进行类型转换(string转成int)
    6. 做一个变量判断
    7. 如果为1时:使用for循环生成一个原型数组
    8. 如果不为1时:将转换为int类型后的切片按照顺序赋值给二维数组(也就是原型数组,此时是第二次赋值)
  6. 还原成原始数组

真代码实现

package mainimport ("bufio""fmt""os""strconv""strings"
)type valNode struct {row intcol intval int
}func main() {// 1. 创建一个原始数组var chessMap [11][11]intchessMap[1][2] = 1 // 1代表黑子chessMap[2][3] = 2 // 2代表白字// 2.输出原始的数组for _, v := range chessMap {for _, v2 := range v {fmt.Printf("%d\t", v2)}fmt.Println()}// 3. 转换成稀疏数组。var sparseArr []valNode // 创建一个数组的切片// 思路// (0). 完整的稀疏数组初始化数据应该是完整的数据范围。valNodeSice := valNode{row: 11,col: 11,val: 0,}sparseArr = append(sparseArr, valNodeSice) // 将第一个初始化数据范围写入数组切片。// fmt.Println("sparrseArr数组的内容是:",sparseArr)// (1). 遍历 chessMap ,如果我们发现有一个元素的值不为0,创建一个node结构体for i, v := range chessMap {for j, v2 := range v {if v2 != 0 { // 如果值不是0才存起来。是0的话就不用存了。压缩的判断节点。//赋值给valNodeSice切片储存起来valNodeSice = valNode{row: i,col: j,val: v2,}// (2). 将检查出来的值,存进变量(数组切片)。sparseArr = append(sparseArr, valNodeSice)}}}// 输出稀疏数组fmt.Println("当前的稀疏数组是::::::")for i, v := range sparseArr {fmt.Printf("%d: %d %d %d \n", i, v.row, v.col, v.val)}// 将这个稀疏数组,存盘 d:/chessmap.datawd(sparseArr)// 如何恢复原始的数组--------------------------------------------------------------// 2. 这里使用稀疏数组恢复readdata()
}func wd(sparseArr []valNode) {FileInfo, err := os.Stat("./chessMap.data") // 先判断一下文件是否存在了。if err == nil {fmt.Println("文件已经存在!", FileInfo.Name()) // 如果存在文件就不写了。} else { // 如果不存在就创建并写入数据data, err := os.OpenFile("./chessMap.data", os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666)if err != nil {fmt.Println("打开文件出错!", err)}defer data.Close()for _, v := range sparseArr {str := strconv.Itoa(v.row) + " " + strconv.Itoa(v.col) + " " + strconv.Itoa(v.val) + "\n"data.WriteString(str)}}
}func readdata() {var arr [][]intvar index = 0// 1. 打开这个d:/chessmap.data这个文件, 恢复原始数组。data, err := os.Open("./chessMap.data")if err != nil {fmt.Println("打开该文件错误", err)}defer data.Close()dataRead := bufio.NewReader(data)for {line, err := dataRead.ReadString('\n')if err != nil {break}index++strSlice := strings.Fields(line)row, _ := strconv.Atoi(strSlice[0])col, _ := strconv.Atoi(strSlice[1])val, _ := strconv.Atoi(strSlice[2])if index == 1 {for i := 0; i < row; i++ {var arrTemp []intfor j := 0; j < col; j++ {arrTemp = append(arrTemp, val)}arr = append(arr, arrTemp)}}if index != 1 {arr[row][col] = val}}fmt.Println("从磁盘读取后的数据:")for _, v := range arr {for _, v2 := range v {fmt.Printf("%d\t", v2)}fmt.Println()}
}

go数据结构与算法| 稀疏数组相关推荐

  1. 数据结构与算法---稀疏数组

    数据结构与算法-稀疏数组 1.基本介绍: ​ 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 2.稀疏数组的处理方法是: ​ (1)记录数组一共有几行几列,有多少个 ...

  2. 数据结构与算法————稀疏数组

    引言 数据压缩方面,我们往往可以通过稀疏数组来保存有效数据,节省存储空间. 一.稀疏数组的概念 当一个数组中大部分元素是0,或为同一个值的时候,可以使用稀疏数组来保存数组. 它是一个十分有效的存储结构 ...

  3. golang数据结构与算法——稀疏数组、队列和链表

    文章目录 一 稀疏数组 1.1 先看一个实际的需求 1.2 稀疏数组基本介绍 1.3 稀疏数组举例说明 1.4 把数组转换为稀疏数组实现 1.5 把稀疏数组还原为原数组 二 队列 2.1 队列的介绍 ...

  4. 数据结构与算法 - 稀疏数组(理解+代码实现案例)

    举例 稀疏数组第一行是原数据几行几列和几个有效数据的个数 下面的行是各个有效数组的行列与具体值 稀疏数组实现 代码实现 package DataStructures.sparsearray;/*** ...

  5. (二)数据结构与算法-稀疏数组

    先看一个实际的需求 分析问题: 因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据 -> 稀疏数组 稀疏sparsearray数组 基本介绍 当一个数组中大部分元素为0,或者为同一个 ...

  6. JavaScript数据结构和算法简述——数组

    为什么先讲数组 数据结构可以简单的被分为线性结构和非线性结构. 线性结构大致包括: 数组(连续存储): 链表(离散存储): 栈(线性结构常见应用,由链表或数组增删和改进功能实现): 队列(线性结构常见 ...

  7. JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

    一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵.定义非零元 ...

  8. java 二维数据结构_JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

    一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵.定义非零元 ...

  9. 数据结构与算法--有序数组中找出和为s的两个数字

    有序数组中找和为s的两个数字 题目:输入一个递增排序的数组array, 和一个数字s, 在数组中找出两个数,使得这两个数的和是s,如果有多对,输出一对即可. 最简单方案 双循环,每次获取一个数据,和数 ...

最新文章

  1. JS中setTimeout()的使用方法具体解释
  2. VTK:PolyData之ThresholdPoints
  3. 内存管理:_CrtDumpMemoryLeaks和_CrtSetBreakAlloc
  4. 利用Inception-V3训练的权重微调,实现猫狗分类(基于keras)
  5. 基于MaxCompute搭建社交好友推荐系统
  6. 自然语言处理——语言模型
  7. leetcode----------Excel Sheet Column Number
  8. C/C++教程 第十七章 —— MFC开发多人聊天室
  9. 银行业会计人员技能训练系统(含文字录入、小键盘、点钞)
  10. Windows上传文件到CentOS系统
  11. js把html转成json,js字符串转成JSON
  12. 解决win10系统点击飞行模式后找不到WiFi连接问题
  13. 唐迟长难句逻辑思维导图(含英语高分笔记)
  14. 自定义带图标文字分割线通用布局,用于列表布局的设置、菜单页的item
  15. 不止代码 == 摘读
  16. 电子电路设计——分频电路设计
  17. Word文档如何转PPT
  18. 苹果4怎么越狱_来看iPhone迁移怎么用 除iOS12.4苹果还为旧款设备推送了更新
  19. 【论文阅读】社交网络传播最大化问题-03
  20. 固定资产系统管理软件最新完整版,固定资产管理系统免费版

热门文章

  1. oracle库存会计期无法打开,打开调整会计期出错!(有图)
  2. 超详细简单解决git的上传和下载
  3. mysql dump 导出表_误删库,别跑路!教你一招MySQL 数据恢复
  4. TCP的可靠传输机制
  5. 力扣77.组合(JavaScript)
  6. Linux socket can例程python版本
  7. C++ vector使用示例
  8. nginx动静分离配置_Nginx动静分离配置实例
  9. C语言中未显示声明函数返回值的类型
  10. java数组实验心得体会_学习JAVA之数组小结