Fork me on GitHub

golang数据结构之稀疏数组

掌握知识:

  • 数组的初始化和赋值
  • 结构体的初始化和赋值
  • 字符串和整型之间的转换以及其它的一些操作
  • 类型断言
  • 读取文件
  • 写入文件
  • 对稀疏数组进行压缩
package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strconv"
    "strings"
    // "strconv"
)

func originArr() [11][11]int {
    //创建原始数组
    var chessMap [11][11]int

    chessMap[1][2] = 1
    chessMap[2][3] = 2
    return chessMap
}

func printArr(chessMap [11][11]int) {
    //打印数组
    for _, v1 := range chessMap {
        for _, v2 := range v1 {
            fmt.Printf("%d\t", v2)
        }
        fmt.Println()
    }
}

//存储行、列、值
type valNode struct {
    row   int
    col   int
    //这里是接口类型,所以值可以是任意类型,不仅仅包含整型和字符型
    value interface{}
}

var sparseArr []valNode

func doParseArr(chessMap [11][11]int) []valNode {
    //稀疏数组
    //遍历数组,如果某个值不为零,则将其放置在对应的结构体中
    val := valNode{
        //原来数组的行和列以及值
        row:   11,
        col:   11,
        value: 0,
    }
    //初始化存储稀疏数组
    sparseArr = append(sparseArr, val)

    for i, v1 := range chessMap {
        for j, v2 := range v1 {
            if v2 != 0 {
                var val valNode
                val.row = i
                val.col = j
                val.value = v2
                sparseArr = append(sparseArr, val)
            }
        }
    }

    for _, j := range sparseArr {
        fmt.Printf("第%d行,第%d列的值是%d\n", j.row, j.col, j.value.(int))

    }
    return sparseArr
}

func writeParseArr(sparseArr []valNode, filepath string) {
    //将稀疏数组存储
    file, err := os.OpenFile(filepath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
    if err != nil {
        return
    }
    defer file.Close()
    for _, j := range sparseArr {
        //因为读取到的整型,需要转为字符串再进行写入
        //将接口赋值给一个变量需要进行类型断言
        str := strconv.Itoa(j.row) + " " + strconv.Itoa(j.col) + " " + strconv.Itoa((j.value.(int))) + "\n"
        wriiter := bufio.NewWriter(file)
        wriiter.WriteString(str)
        wriiter.Flush()
        // fmt.Printf("第%d行,第%d列的值是%d\n", j.row, j.col, j.value.(int))

    }
}

func readParseArr(filepath string) (newChessMap [11][11]int) {
    //初始化数组
    //读取存储的文件,并将每行转成
    file, err := os.OpenFile(filepath, os.O_RDONLY, 0666)
    if err != nil {
        return
    }
    defer file.Close()
    reader := bufio.NewReader(file)
    for {
        str, err := reader.ReadString('\n')
        if err != nil {
            return
        }
        tmp := strings.Split(strings.TrimRight(str, "\n"), " ")
        // fmt.Println(strings.Split(strings.TrimRight(str, "\n"), " "))
        r, _ := strconv.Atoi(tmp[0])
        c, _ := strconv.Atoi(tmp[1])
        v, _ := strconv.Atoi(tmp[2])
        if r == 11 {
            continue
        }
        newChessMap[r][c] = v
        if err == io.EOF {
            break
        }
    }
    return newChessMap
}

func main() {
    chessMap := originArr()
    printArr(chessMap)
    sparseArr := doParseArr(chessMap)
    filepath := "data.txt"
    writeParseArr(sparseArr, filepath)
    newChessMap := readParseArr(filepath)
    printArr(newChessMap)
}

 

 data.txt

 

 

posted @ 2019-12-07 17:34  西西嘛呦  阅读(310)  评论(0编辑  收藏  举报