掌握知识:

  • 数组的初始化和赋值
  • 结构体的初始化和赋值
  • 字符串和整型之间的转换以及其它的一些操作
  • 类型断言
  • 读取文件
  • 写入文件
  • 对稀疏数组进行压缩
package main

import (
"bufio"
"fmt"
"io"
"os"
"strconv"
"strings"
// "strconv"
) func originArr() [][]int {
//创建原始数组
var chessMap [][]int chessMap[][] =
chessMap[][] =
return chessMap
} func printArr(chessMap [][]int) {
//打印数组
for _, v1 := range chessMap {
for _, v2 := range v1 {
fmt.Printf("%d\t", v2)
}
fmt.Println()
}
} //存储行、列、值
type valNode struct {
row int
col int
//这里是接口类型,所以值可以是任意类型,不仅仅包含整型和字符型
value interface{}
} var sparseArr []valNode func doParseArr(chessMap [][]int) []valNode {
//稀疏数组
//遍历数组,如果某个值不为零,则将其放置在对应的结构体中
val := valNode{
//原来数组的行和列以及值
row: ,
col: ,
value: ,
}
//初始化存储稀疏数组
sparseArr = append(sparseArr, val) for i, v1 := range chessMap {
for j, v2 := range v1 {
if v2 != {
var val valNode
val.row = i
val.col = j
val.value = v2
sparseArr = append(sparseArr, val)
}
}
} for _, j := range sparseArr {
fmt.Printf("第%d行,第%d列的值是%d\n", j.row, j.col, j.value.(int)) }
return sparseArr
} func writeParseArr(sparseArr []valNode, filepath string) {
//将稀疏数组存储
file, err := os.OpenFile(filepath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, )
if err != nil {
return
}
defer file.Close()
for _, j := range sparseArr {
//因为读取到的整型,需要转为字符串再进行写入
//将接口赋值给一个变量需要进行类型断言
str := strconv.Itoa(j.row) + " " + strconv.Itoa(j.col) + " " + strconv.Itoa((j.value.(int))) + "\n"
wriiter := bufio.NewWriter(file)
wriiter.WriteString(str)
wriiter.Flush()
// fmt.Printf("第%d行,第%d列的值是%d\n", j.row, j.col, j.value.(int)) }
} func readParseArr(filepath string) (newChessMap [][]int) {
//初始化数组
//读取存储的文件,并将每行转成
file, err := os.OpenFile(filepath, os.O_RDONLY, )
if err != nil {
return
}
defer file.Close()
reader := bufio.NewReader(file)
for {
str, err := reader.ReadString('\n')
if err != nil {
return
}
tmp := strings.Split(strings.TrimRight(str, "\n"), " ")
// fmt.Println(strings.Split(strings.TrimRight(str, "\n"), " "))
r, _ := strconv.Atoi(tmp[])
c, _ := strconv.Atoi(tmp[])
v, _ := strconv.Atoi(tmp[])
if r == {
continue
}
newChessMap[r][c] = v
if err == io.EOF {
break
}
}
return newChessMap
} func main() {
chessMap := originArr()
printArr(chessMap)
sparseArr := doParseArr(chessMap)
filepath := "data.txt"
writeParseArr(sparseArr, filepath)
newChessMap := readParseArr(filepath)
printArr(newChessMap)
}

data.txt

golang数据结构之稀疏数组的更多相关文章

  1. 图解Java数据结构之稀疏数组

    在编程中,算法的重要性不言而喻,没有算法的程序是没有灵魂的.可见算法的重要性. 然而,在学习算法之前我们需要掌握数据结构,数据结构是算法的基础. 我在大学的时候,学校里的数据结构是用C语言教的,因为对 ...

  2. 数据结构(1):稀疏数组使用java实现

    主要是用于数组压缩,去除无效的数组内容: 原数组内容: 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 转换成 稀疏数组 5 5 2 1 1 1 2 ...

  3. Java数据结构之稀疏数组(Sparse Array)

    1.需求 编写的五子棋程序中,有存盘退出和续上盘的功能.因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,为了压缩存储所以采用稀疏数组. 2.基本介绍 当一个数组中大部分元素为0,或者为 ...

  4. 数据结构与算法之java语言实现(一):稀疏数组

    一.概念&引入 什么是稀疏数组? 稀疏数组是面对一个二维数组中有众多重复元素的情况下,为了节省磁盘空间,将此二维数组转化为更加节省空间的一种数组,我们叫他稀疏数组. 只是听概念或许会看不明白, ...

  5. 【学习总结】java数据结构和算法-第三章-稀疏数组和队列

    相关链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 稀疏数组 队列 稀疏数组 稀疏数组介绍 图示 应用实例 代码实现 SparseArray.java:与二 ...

  6. 数据结构和算法(Golang实现)(13)常见数据结构-可变长数组

    可变长数组 因为数组大小是固定的,当数据元素特别多时,固定的数组无法储存这么多的值,所以可变长数组出现了,这也是一种数据结构.在Golang语言中,可变长数组被内置在语言里面:切片slice. sli ...

  7. Java成神之路:第二帖---- 数据结构与算法之稀疏数组

    数据结构与算法--稀疏数组 转换方法 记录数组有几行几列,有多少个不同的值 把不同的值的元素的行列,记录在一个小规模的数组中,以此来缩小数组的规模 如图: 二维数组转稀疏数组 对原始的二维数组进行遍历 ...

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

    本文源码:GitHub·点这里 || GitEE·点这里 一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反, ...

  9. 数据结构 二维数组-->稀疏数组-->二维数组

    稀疏数组基本概念: 稀疏数组应用场景: 当一个数组大部分的元素为"0",或者为同一个值的数组时,可以使用稀疏数组来保存该数组 处理方法: 1>记录数组一共有几行几列,有多少不 ...

随机推荐

  1. Java学习笔记-Java文件操作流

     day03 输入输出流:读入写出  节点流:   有明确的来源和去向   往往对字节操作 节点流又叫低级流.字节流   处理流:  没有明确的来源和去向  往往对低级流或其他高级流进行操作,不能独立 ...

  2. mongodb使用_遍历列表中的元素,作为变量,循环修改mongodb中的字段

    一.问题描述: 需要将工作界面上的一些已经离职的用户状态改为失效,并备注为离职 二.需要准备/拿到手的工具/条件/数据: 1.已离职人员名单(excel格式) 2.任意mongodb工具(笔者使用的是 ...

  3. mysql登录错误:'Access denied for user 'root'@'localhost'

    首先是不知道怎么忽然mysql用命令行,workbench都登录不了,都提示'Access denied for user 'root'@'localhost'. 数据库卸载重装了几次都不行.好像感觉 ...

  4. [PHP] socket客户端时的超时问题

    连接socket分为连接超时和读取超时 $sock=stream_socket_client("www.google.com:80", $errno,$errstr,2);    ...

  5. 磕磕绊绊中,使用Git工具完成代码上传

    1.安装Git工具 1)下载并安装Git工具:Git下载地址 安装完成之后,在桌面空白处点击右键,会出现以下选项: 2.初始化环境 1) 在一文件夹中,点击右键,选择上图中的Git Bash Here ...

  6. 如何给女朋友讲明白:Java 中 Stack(栈) 与 Heap(堆)

    背景 Java 中 Stack(栈) 与 Heap(堆) 是面试中被经常问到的一个话题. 有没有对 Java 中 Stack(栈) 与 Heap(堆) 烂熟于心的童鞋,请举手!!!(怎么没人举手-) ...

  7. EF中存储过程的使用

    存储过程即用来完成一个特定功能的一段代码.它的优缺点 优点 存储过程可封装,并隐藏复杂的商业逻辑. 存储过程可以回传值,并可以接受参数. 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与 ...

  8. Java描述设计模式(10):组合模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.文件系统 下图是常见的计算机文件系统的一部分. 文件系统是一个树结构,树上长有节点.树的节点有两种: 树枝节点 即文件夹,有 ...

  9. springaop\ cglib\ AspectJ

    元编程 vs 动态代理 vs isa代理 springaop的底层实现有两种,一种是jdk的动态代理,另一种是cglib,springaop没有用到aspectj,只是借鉴了它并添加了aspectj风 ...

  10. .net core 2.1 基于Jwt的登录认证

    1.新建一个.net core2.1 基于 api 的工程,引用Microsoft.AspNetCore.Authentication.JwtBearer 包 2.新建一个Token的实体类,一个Jw ...