go语言数据结构第一篇-稀疏数组

 使用稀疏数组存储能大大节省磁盘空间,代码如下:

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文件。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值