稀疏数组能够节省存储空间
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
// ValNode 定义node结构体
type ValNode struct {
row int //行
col int //列
val int //值
}
func main() {
//1.先创建一个原始数组
var chessMap [11][11]int
chessMap[1][2] = 1 //黑子
chessMap[2][3] = 2 //蓝子
//2.输出原始数据
for _,v1 := range chessMap{
for _,v2 := range v1{
fmt.Printf("%d\t",v2)
}
fmt.Println()
}
//3.转成稀疏数组
//(1)遍历原始数据,如果发现值不是0,则创建一个node结构体
//(2)将其放入到对应的切片
//定义稀疏数组 在go里面是切片,里面的元素师ValNode
var sparseArr []ValNode
//由于需要稀疏数组需要记录二维数组的规模(一共有多少行、多少列、默认值),所以先创建第一个node节点
valNode := ValNode{
row: 11,
col: 11,
val: 0,
}
sparseArr = append(sparseArr,valNode)
for k1,v1 := range chessMap{
for k2,v2 := range v1{
if v2 != 0 {
//创建一个结构体,存储起来
valNode := ValNode{
row: k1,
col: k2,
val: v2,
}
sparseArr = append(sparseArr,valNode)
}
}
}
//fmt.Println(sparseArr)
//写入文件保存
filePath := "./day1/chess.txt"
//先格式化字符串
//for _,v := range sparseArr{
// str := fmt.Sprintf("%s %s %s\n",strconv.Itoa(v.row),strconv.Itoa(v.col),strconv.Itoa(v.val))
// fmt.Println(str)
// err := writeFile(filePath,str)
// if err != nil {
// fmt.Println("写入失败")
// }
//}
//读取文件
//fmt.Println("开始读取")
//res,err := readFile(filePath)
//if err != nil{
//
//}
//fmt.Println("返回的结果")
//fmt.Println(res)
//arr := strings.Fields(str)
res,err := readFileGetArr(filePath)
if err != nil {
}
//
var chessMap2 [11][11]int
for i,v := range res{
if i != 0 {
a,_ := strconv.Atoi(v[0])
b,_ := strconv.Atoi(v[1])
c,_ := strconv.Atoi(v[2])
fmt.Println(a,b,c)
chessMap2[a][b] = c
}
}
for _,v1 :=range chessMap2{
for _,v2 := range v1{
fmt.Print(v2)
}
fmt.Println()
}
}
func writeFile(filePath string,str string) (err error) {
//1.创建文件对象
file,err := os.OpenFile(filePath,os.O_WRONLY | os.O_APPEND,0666)
if err != nil {
fmt.Println("创建文件对象失败")
return err
}
defer file.Close()
//2.操作对象
writer := bufio.NewWriter(file)
_, err = writer.WriteString(str)
if err != nil {
fmt.Println("写入失败")
return err
}
//3.刷新
err = writer.Flush()
if err != nil {
return err
}
return nil
}
func readFile(filePath string) (res string,err error) {
//打开文件
file,err := os.Open(filePath)
if err != nil{
return "",err
}
//创建reader对象
reader := bufio.NewReader(file)
for {
str,err := reader.ReadString('\n')
res += str
if err != nil && err.Error() == "EOF" {
break
}
}
return res,nil
}
func readFileGetArr(filePath string) (res [][]string,err error) {
//打开文件
file,err := os.Open(filePath)
if err != nil{
return nil,err
}
reader := bufio.NewReader(file)
for {
str,err := reader.ReadString('\n')
if err != nil && err.Error() == "EOF" {
break
}
arr := strings.Fields(str)
res = append(res,arr)
}
return res,nil
}