go稀疏数组

发布于:2024-04-29 ⋅ 阅读:(90) ⋅ 点赞:(0)

稀疏数组

稀疏数组

在这里插入图片描述
在这里插入图片描述

package test

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"reflect"
	"testing"
)

type ValNode struct {
	Row int `json:"row"`
	Col int `json:"col"`
	Val int `json:"val"`
}

func TestSparseArray(t *testing.T) {
	// 1 创建一个原始数组
	var chessMap [11][11]int
	chessMap[1][2] = 1
	chessMap[2][3] = 2
	// 2 输出看看原始数组
	for _, v := range chessMap {
		for _, v2 := range v {
			fmt.Printf("%d\t", v2)
		}
		fmt.Println()
	}
	// 3 转成稀疏数组
	var sparseArray []ValNode
	sparseArray = append(sparseArray, ValNode{len(chessMap), len(chessMap[0]), 0})
	for i, v := range chessMap {
		for j, v2 := range v {
			if v2 != 0 {
				// 创建一个值节点
				valNode := ValNode{
					Row: i,
					Col: j,
					Val: v2,
				}
				sparseArray = append(sparseArray, valNode)
			}

		}
	}
	// 输出稀疏数组
	for i, valNode := range sparseArray {
		fmt.Printf("%d: %d\t%d\t%d\n", i, valNode.Row, valNode.Col, valNode.Val)
	}

	// 将这个稀疏数组存盘
	// Serialize slice of ValNode
	marshal, err := json.Marshal(sparseArray)
	if err != nil {
		log.Fatal("json.Marshal", err)
	}
	log.Println("Serialized slice of ValNode:", string(marshal))

	// to-db
	err = ioutil.WriteFile("./output.txt", marshal, 0644)
	if err != nil {
		log.Fatal("写入文件时发生错误:", err)
	}
	log.Println("数据成功写入文件。")

	// read-db
	data, err := ioutil.ReadFile("./output.txt")
	if err != nil {
		log.Fatal("读取文件时发生错误:", err)
	}
	log.Println("数据成功写入文件。")

	// Deserialize slice of ValNode
	var unmarshal []ValNode
	err = json.Unmarshal(data, &unmarshal)
	if err != nil {
		log.Fatal("json.Unmarshal", err)
	}
	log.Println("Deserialized slice of ValNode:", unmarshal)
	log.Println("Type of Deserialized slice of ValNode:", reflect.TypeOf(unmarshal))
	// 创建一个原始数组
	// 创建一个二维切片,包含 11 行
	chessMap2 := make([][]int, unmarshal[0].Row)

	// 初始化每一行元素为包含 11 个元素的切片
	for i := range chessMap2 {
		chessMap2[i] = make([]int, unmarshal[0].Col)
	}
	for i, valNode := range unmarshal {
		if i != 0 {
			chessMap2[valNode.Row][valNode.Col] = valNode.Val
		}

	}
	// 看看chessMap2 是不是恢复
	// 输出稀疏数组
	for _, v := range chessMap2 {
		for _, v2 := range v {
			fmt.Printf("%d\t", v2)
		}
		fmt.Println()
	}
}


网站公告

今日签到

点亮在社区的每一天
去签到