网络人

GO语言学习实战1:数组转为稀疏数据实现数据压缩

Kwok: 2020-10-26 17:10:30 点击:7 评论: 0

我们前面的基础知识里有说过GO语言在声明数组时必须指定数组的长度,当我们还未使用到的值,默认为0,在实际项目开发中可能会将这些值存入文件或者 数据库中,为了减少数据的占用我们可以压缩成稀疏数据存储。下面代码将实现压缩与解压的过程。

package main
import "fmt"

//ValNode 稀疏数据保存的结构
type ValNode struct {
	Row int //行
	Col int //列
	Val int //值
}

//通过for rang格式化打印数组值
func printRangeArray(arr [11][15]int) {
	for _, v := range arr {
		for _, vv := range v {
			fmt.Print("t", vv)
		}
		fmt.Println()
	}
}

//makeSparseArray将一个数组压缩成稀疏数据
func makeSparseArray(chessMape [11][15]int) []ValNode {
	var sparse []ValNode //定义一个ValNode切片
	sparse = append(sparse, ValNode{
		len(chessMape),    //根据传入的数组设置默认行
		len(chessMape[0]), //默认列
		0,                 //默认值
	})
	for i, v := range chessMape {
		for j, vv := range v {
			if vv != 0 { //当vv不是默认值0的时候才写入稀疏数据
				sparse = append(sparse, ValNode{i, j, vv}) //i是列,j是行,vv是值
			}
		}
	}
	return sparse
}
func main() {
	var chessMap [11][15]int
	chessMap[1][5] = 2
	chessMap[2][3] = 5
	printRangeArray(chessMap) //打印原始数组里的数据
	/*
	   0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
	   0       0       0       0       0       2       0       0       0       0       0       0       0       0       0
	   0       0       0       5       0       0       0       0       0       0       0       0       0       0       0
	   0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
	   0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
	   0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
	   0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
	   0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
	   0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
	   0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
	   0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
	*/
	SparseArray := makeSparseArray(chessMap) //压缩成稀疏数据
	fmt.Println("稀疏数据还原成数组")
	var chessMap2 [11][15]int //定义数组chessMap2
	for i, v := range SparseArray {
		fmt.Println(i, ":", v) //遍历压缩后的稀疏数据,也可以将压缩后的数据直接存入数据库或者文件里
		if i != 0 {
			chessMap2[v.Row][v.Col] = v.Val //第0行保存的是数据结构,所以跳过
			//将chessMap2[第v.Row行][第v.Col列]设置成v.Val
		}
	}
	//压缩后可以有效减少数据存储的空间
	/*
		0 : {11 15 0}
		1 : {1 5 2}
		2 : {2 3 5}
	*/
	printRangeArray(chessMap2) //打印还原后的数组
	/*
			    0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
		        0       0       0       0       0       2       0       0       0       0       0       0       0       0       0
		        0       0       0       5       0       0       0       0       0       0       0       0       0       0       0
		        0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
		        0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
		        0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
		        0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
		        0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
		        0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
		        0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
		        0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
	*/
}

当数组长度越多,定义的值越少的时候,就可以看到稀疏数据只压缩有效的值。

本文地址:http://m.neter8.com/go/87.html

本站推荐阅读

热门点击文章