zoukankan      html  css  js  c++  java
  • GO map

    map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。

    map定义

    语法:map[KeyType]ValueType
    KeyType:表示键的类型。
    ValueType:表示键对应的值的类型
    map类型的变量默认初始值为nil,需要使用make()函数来分配内存。
    语法:make(map[KeyType]ValueType, [cap])
    cap表示map的容量,该参数虽然不是必须的

    var a1 map[string]int
        fmt.Println(a1 == nil)  //true
        //初始化
        a := make(map[string]int,3)
        a["ares"] = 100
        a["ares1"] = 1000
        fmt.Println(a)  //map[ares:100 ares1:1000]
    

    map声明的时候初始化

    b := map[int]int{
            1:1,
            2:2,
        }
        fmt.Println(b) //map[1:1 2:2]
    

    判断某个键是否存在

    语法:value, ok := map[key]

    //判断某个值是否存在
        c := map[string]int{
            "北京":80,
            "上海":70,
            "成都":90,
        }
        // 如果key存在ok为true,v为对应的值;不存在ok为false,v为值类型的零值
        v,ok := c["北京"]
        if ok{
            fmt.Println(v)  //存在 80
        }else{
            fmt.Println("不存在")
        }
    

    map的遍历

    使用for range遍历map。

    //k,v遍历
        for k,v :=range c{
            fmt.Println(k,v)
        }
        输出:北京 80
            上海 70
            成都 90
        //只遍历map中的key
        for k := range c{
            fmt.Println(k)
        }
        输出:上海
            成都
            北京
        //只遍历map中的value
        for _,v := range c{
            fmt.Println(v)
        }
        输出:90
            80
            70
    

    遍历map时输出的元素顺序与填充顺序无关,遍历是无序的!

    按照指定顺序遍历map

    var d = make(map[string]int,50)
        //添加10个键值对
        for i:=0;i<10;i++{
            key := fmt.Sprintf("test%02d",i)    //生成test开头的字符串
            value := rand.Intn(100)     //生成0-99的随机数
            d[key] = value
            //fmt.Println(key,value)
        }
        //按照key从大到小顺序遍历d
        //取出map中的key存入切片
        keys := make([]string,0,50)
        for k := range d{
            keys = append(keys,k)
        }
        //fmt.Println(keys)
        //对切片排序
        sort.Strings(keys)
        //fmt.Println(keys)
        //按照排序后的key遍历
        for _,v :=range keys{
            fmt.Println(v,d[v])
        }
        输出:
        test00 81
        test01 87
        test02 47
        test03 59
        test04 81
        test05 18
        test06 25
        test07 40
        test08 56
        test09 0
        //按照value排序
        values := make([]int,0,50)
        for _,v := range d{
            values = append(values,v)
        }
        sort.Ints(values)
        //fmt.Println(values)
        for _,v := range values{
            //fmt.Println(v)
            for k1,v1 :=range d{
                if v == v1{
                    fmt.Println(k1,v1)
                }
            }
            输出:
            test09 0
            test05 18
            test06 25
            test07 40
            test02 47
            test08 56
            test03 59
            test00 81
            test04 81
            test00 81
            test04 81
            test01 87
        }
    

    map的删除

    delete() 函数用于删除集合的元素, 参数为 map 和其对应的 key。实例如下:

    func main() {
        // 初始化map
        citymap := map[string]string {
            "bj":"bj",
            "shandong":"jinan",
            "sichuan":"chengdu",
            "jiangsu":"nanjing",
        }
        fmt.Println("原始map")
        for k,v := range citymap{
            fmt.Printf("province is:%v,shenghui is %v
    ",k,v)
        }
        //删除bj
        delete(citymap,"bj")
        fmt.Println("删除后map")
        for k,v := range citymap{
            fmt.Printf("province is:%v,shenghui is %v
    ",k,v)
        }
    }
    输出:
    原始map
    province is:shandong,shenghui is jinan
    province is:sichuan,shenghui is chengdu
    province is:jiangsu,shenghui is nanjing
    province is:bj,shenghui is bj
    删除后map
    province is:sichuan,shenghui is chengdu
    province is:jiangsu,shenghui is nanjing
    province is:shandong,shenghui is jinan
    

    元素为map类型的切片

    //元素为map类型的切片
        var map1 = make([]map[string]string,5)  //切片的初始化
        for k,v :=range map1{
            fmt.Println(k,v)
        }
        //对切片中map元素进行初始化
        map1[0] = make(map[string]string,3)
        map1[0]["name"] = "ares"
        map1[0]["sex"] = "man"
        map1[0]["age"] = "22"
        for k,v := range map1{
            fmt.Println(k,v)
        }
        输出:
        0 map[name:ares sex:man age:22]
        1 map[]
        2 map[]
        3 map[]
        4 map[]
    

    值为切片类型的map

    //值为切片的map
        var map2 = make(map[string][]int,5) //只完成了map的初始化,因为值是个切片,所以初始化为[]int
        v,ok := map2["ares"]
        if ok{
            fmt.Println(v)
        }else{
            //map2没有ares这个键
            map2["ares"] = make([]int,5)    //切片初始化
            map2["ares"][0] = 1
            map2["ares"][1] = 1
            map2["ares"][2] = 1
        }
        for k,v :=range map2{
            fmt.Println(k,v)    //ares [1 1 1 0 0]
        }
    

    统计字符串中单词出现次数

    //统计单词出现次数
        var s = "what are you nong sha nong"
        //定义一个map
        var map3 = make(map[string]int,10)
        //字符串中有哪些单词,返回一个切片
        s1 := strings.Split(s," ")
        //fmt.Println(s1)
        //遍历单词做统计
        for _,v1 :=range s1{
            vv,ok :=  map3[v1]
            if ok{
                //map中有记录
                map3[v1] = vv+1
            }else{
                map3[v1] = 1
            }
        }
        for k,v := range map3{
            fmt.Println(k,v)
        }
        输出:
        what 1
        nong 2
        sha 1
        are 1
        you 1
    
  • 相关阅读:
    hdu 1695(莫比乌斯反演)
    hdu 6035(Colorful Tree)
    Splay模板(序列终结者)
    我的CSDN博客
    【洛谷P2041 分裂游戏】数学+瞎蒙
    【洛谷P1962 斐波那契数列】矩阵快速幂+数学推导
    【LOJ 109 并查集】 并查集
    【洛谷P1816 忠诚】线段树
    【洛谷1339 [USACO09OCT]】热浪Heat Wave 图论+最短路
    【洛谷1433】吃奶酪 搜索+剪枝
  • 原文地址:https://www.cnblogs.com/aresxin/p/GO-map.html
Copyright © 2011-2022 走看看