当一个数组中大部分元素为0,或者为同一个值的数组时,能够应用稠密数组来保留该数组
如下图,在一个二维数组中大部分是同一个数,这样的状况就能够应用稠密数组来保留数据
实现一个稠密数组
package mainimport ( "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.go0 0 0 0 0 0 0 0 0 0 00 0 1 0 0 0 0 0 0 0 00 0 0 2 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0以后的稠密数组是:::::11 11 01 2 12 3 2复原后的原始数据0 0 0 0 0 0 0 0 0 0 00 0 1 0 0 0 0 0 0 0 00 0 0 2 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0