• 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	", 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
    ", 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))) + "
    "
            wriiter := bufio.NewWriter(file)
            wriiter.WriteString(str)
            wriiter.Flush()
            // fmt.Printf("第%d行,第%d列的值是%d
    ", 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('
    ')
            if err != nil {
                return
            }
            tmp := strings.Split(strings.TrimRight(str, "
    "), " ")
            // fmt.Println(strings.Split(strings.TrimRight(str, "
    "), " "))
            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

  • 相关阅读:
    Spring中bean的生命周期
    HashMap与HashTable原理及数据结构
    HashMap 与HashTable的区别
    2 rocketmq mqadmin 的用法详解
    搭建RocketMQ踩的坑-内存不足
    解决Hash碰撞冲突方法总结
    大端BigEndian、小端LittleEndian与字符集编码
    Linux中最常用的JAVA_HOME配置
    WIP_DISCRETE_JOBS.STATUS_TYPE
    Inventory > INV.MTL_MATERIAL_TRANSACTIONS Show Error Msg: ORA-20100: File lxxx.tmp creation for FND_FILE failed.
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12002686.html
Copyright © 2020-2023  润新知