我们前面的基础知识里有说过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
*/
}
当数组长度越多,定义的值越少的时候,就可以看到稀疏数据只压缩有效的值。
除非注明,网络人的文章均为原创,转载请以链接形式标明本文地址:https://www.55mx.com/post/87
《GO语言学习实战1:数组转为稀疏数据实现数据压缩》的网友评论(0)