使用稀疏数组存储能大大节省磁盘空间,代码如下:
package main
import (
"bufio"
"fmt"
"log"
"os"
"strconv"
"strings"
)
type nodeval struct {
row int
col int
val interface{}
}
//根据本地data文件还原成原始数据
func ReadData(filename string) {
file, err := os.OpenFile(filename, os.O_RDONLY, 0666)
if err != nil {
log.Fatalf("%s", err)
}
defer file.Close()
bfrd := bufio.NewReader(file)
var index = 0
var arr [][]int
for {
line, err := bfrd.ReadBytes('\n')
if err != nil {
break
}
index++
temp := strings.Split(string(line), " ")
row, _ := strconv.Atoi(temp[0])
col, _ := strconv.Atoi(temp[1])
value, _ := strconv.Atoi(temp[2])
if index == 1 {
for i := 0; i < row; i++ {
var arr_temp []int
for j := 0; j < col; j++ {
arr_temp = append(arr_temp, value)
}
arr = append(arr, arr_temp)
}
}
if index != 1 {
arr[row][col] = value
}
}
// 打印数据
fmt.Println("从磁盘读取后的数据:")
for _, v := range arr {
for _, v1 := range v {
fmt.Printf("%d\t", v1)
}
fmt.Println()
}
}
func main() {
//1.先创建一个原始数组
var chessMap [11][11]int //11*11格局的棋盘,默认值都为0
chessMap[1][2] = 1 //第一行第二列值为1,代表黑子
chessMap[2][3] = 2 //第二行第三列值为2,代表白子
//2.输出查看原始的数组
fmt.Println("原始数组是:")
for _,oneArray :=range chessMap{//遍历二维数组得到一维数组oneArray
for _,v :=range oneArray {//再对这个一维数组遍历得到一个个值
fmt.Printf("%d\t",v)
}
fmt.Println()//打印11个数后换行
}
//3.转成一个稀疏数组。思路:
//(1)遍历chessMap,如果发现有一个元素的值不为0,创建一个node结构体
//(2)将其放入对应的切片即可
var sparseArr []nodeval
//标准的一个稀疏数组应该还应该有一个记录原始二维数组的规模(行列数)
//创建一个ValNode节点
ValNode0 := nodeval{
row:11,
col:11,
val:0,
}
sparseArr = append(sparseArr,ValNode0)//将第一个节点(0:11 11 0)加入数组中
for i,oneArray :=range chessMap{//遍历二维数组得到一维数组oneArray
for j,v :=range oneArray {//再对这个一维数组遍历得到一个个值
if v != 0 {
//创建一个ValNode值节点
ValNode1And2 := nodeval{
row:i,
col:j,
val:v,
}
//将第二个节点(1:1 2 1)和第三个节点(2:2 3 2)加入数组中
sparseArr = append(sparseArr,ValNode1And2)
}
}
}
//遍历稀疏数组并打印输出
fmt.Println("当前的稀疏数组是:")
for _,ValNode := range sparseArr{
fmt.Printf(" %d\t%d\t%d\n",ValNode.row,ValNode.col,ValNode.val)
}
// 指定稀疏数组存盘路径
filepath := "/home/sxf/go/src/DataStruct/One-sparseArray/chess.data"
file, err := os.OpenFile(filepath, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Printf("open file err=%v\n", err)
}
defer file.Close()
//将稀疏数组存盘
writer := bufio.NewWriter(file)
for _, node := range sparseArr {
str := fmt.Sprintf("%d %d %d \n", node.row, node.col, node.val)
writer.WriteString(str)
}
writer.Flush()
// 从磁盘读取稀疏数组并转换成原始数据
ReadData(filepath)
}
运行查看结果:
同时在代码中指定的filepath路径下会产生一个chess.data文件。