当一个数组中大部分元素为0,或者为同一个值的数组时,能够应用稠密数组来保留该数组
如下图,在一个二维数组中大部分是同一个数,这样的状况就能够应用稠密数组来保留数据
实现一个稠密数组
package main
import ("fmt")
type ValNode struct {
row int
col int
val int
}
func main() {
//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. 转成稠密数组
//(1). 遍历 chessMap, 如果咱们发现有一个元素的值不为 0,创立一个 node 构造体
//(2). 将其放入到对应的切片即可
var sparseArr []ValNode
// 规范的一个稠密数组应该还有一个 记录元素的二维数组的规模 (行和列,默认值)
// 创立一个 ValNode 值,记录行数,列数。默认值
valNode := ValNode{
row : 11,
col : 11,
val : 0,
}
// 将行数,列数,默认值退出到数组中
sparseArr = append(sparseArr, valNode)
for i, v := range chessMap {
for j, v2 := range v {
if v2 != 0 {
// 创立一个 ValNode 值结点
valNode := ValNode{
row : i,
col : j,
val : v2,
}
sparseArr = append(sparseArr, valNode)
}
}
}
//4. 输入稠密数组
fmt.Println("\n 以后的稠密数组是:::::")
for _, valNode := range sparseArr {fmt.Printf("%d %d %d\n", valNode.row, valNode.col, valNode.val)
}
// 先创立一个原始数组
var chessMap2 [11][11]int
// 遍历 sparseArr [遍历文件每一行]
for i, valNode := range sparseArr {
if i != 0 {
// 跳过第一行记录值
chessMap2[valNode.row][valNode.col] = valNode.val
}
}
// 看看 chessMap2 是不是复原 .
fmt.Println("复原后的原始数据")
for _, v := range chessMap2 {
for _, v2 := range v {fmt.Printf("%d\t", v2)
}
fmt.Println()}
}
执行的输入为
>go run main.go
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
以后的稠密数组是:::::
11 11 0
1 2 1
2 3 2
复原后的原始数据
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0