GO语言笔记--map

桃扇骨 2022-02-23 05:24 422阅读 0赞

1.说明

1)类似其他语言中的哈希表或者字典,以key-value形式存储数据

2)key必须是支持==或!=比较运算的类型,不可以是函数、map或slice

3)map查找比线性搜索快很多,但比使用所有房屋数据的类型慢100倍

4)map使用make()创建,支持:=这种简写方式

5)map使用哈希表,必须可以比较相等

6)除了slice,map,function的内建类型都可以错误key

7)Struct类型不包含上述字段,也可以作为key

2.操作

1)make([KeyType]value,cap),cap表示容量,可省略

2)超出容量时会自动扩容,但尽量提供一个合理的初始值

3)使用len()获取元素个数

4)获取元素:m[k]

5)key不存在时,获得value类型的初始值(零值)

6)用value, ok := m[key]来判断是否存在key

7)用delete删除一个key

8)用range遍历key,或者遍历key,value对

9)不保证遍历顺序,如需顺序,需要手动对key排序

10)使用len获取元素个数

注意:

1)键值对不存在时自动添加,使用delete()删除某键值对

2)使用for range对map和slice进行迭代操作

实例:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. m1 := map[int]string{1: "a", 2: "b", 3: "c", 4: "d", 5: "e",
  7. 6: "f", 7: "g", 8: "h", 9: "i", 0: "j"}
  8. fmt.Println("m1", m1)
  9. m2 := make(map[string]int)
  10. for i, v := range m1 {
  11. m2[v] = i
  12. }
  13. fmt.Println("m2", m2)
  14. }
  15. 输出:
  16. API server listening at: 127.0.0.1:47449
  17. m1 map[2:b 1:a 3:c 4:d 5:e 6:f 7:g 8:h 9:i 0:j]
  18. m2 map[a:1 c:3 d:4 f:6 g:7 j:0 b:2 h:8 e:5 i:9]

实例二

  1. package main
  2. import "fmt"
  3. func main() {
  4. m := map[string]string{
  5. "name": "ccmouse",
  6. "course": "golang",
  7. "site": "imooc",
  8. "quality": "notbad",
  9. }
  10. fmt.Println(m)
  11. //定义一个空map
  12. m2 := make(map[string]int) //m2 == empty map
  13. var m3 map[string]int // m3 == nil
  14. fmt.Println(m2, m3)
  15. //map遍历
  16. for k, v := range m {
  17. fmt.Println(k, v)
  18. }
  19. }
  20. 输出:
  21. API server listening at: 127.0.0.1:45987
  22. map[name:ccmouse course:golang site:imooc quality:notbad]
  23. map[] map[]
  24. quality notbad
  25. name ccmouse
  26. course golang
  27. site imooc

上述对m的输出前后顺序不一样,这是因为map在内存中是无序的

3.获取变量

  1. package main
  2. import "fmt"
  3. func main() {
  4. m := map[string]string{
  5. "name": "ccmouse",
  6. "course": "golang",
  7. "site": "imooc",
  8. "quality": "notbad",
  9. }
  10. courseName := m["course"]
  11. fmt.Println(courseName)
  12. cName := m["cour"]
  13. fmt.Println(cName)
  14. fmt.Println("end")
  15. }
  16. 输出:
  17. API server listening at: 127.0.0.1:37028
  18. golang
  19. end

上述代码尤其注意k值拼写错误并不会报错,只是输出为空,这是因为零值,那么如何判断K值是否存在呢,看下面代码,获取时候获取一个状态就好了

  1. package main
  2. import "fmt"
  3. func main() {
  4. m := map[string]string{
  5. "name": "ccmouse",
  6. "course": "golang",
  7. "site": "imooc",
  8. "quality": "notbad",
  9. }
  10. if courseName, ok := m["course"]; ok {
  11. fmt.Println(courseName)
  12. } else {
  13. fmt.Println("course key does not exit")
  14. }
  15. if cName, ok := m["cour"]; ok {
  16. fmt.Println(cName)
  17. } else {
  18. fmt.Println("cour key does not exit")
  19. }
  20. }
  21. 输出:
  22. API server listening at: 127.0.0.1:28373
  23. golang
  24. cour key does not exit

可以看出course存在直接输出,cour不存在则报错

4.删除

  1. package main
  2. import "fmt"
  3. func main() {
  4. m := map[string]string{
  5. "name": "ccmouse",
  6. "course": "golang",
  7. "site": "imooc",
  8. "quality": "notbad",
  9. }
  10. fmt.Println(m)
  11. delete(m, "name")
  12. fmt.Println(m)
  13. }
  14. 输出:
  15. API server listening at: 127.0.0.1:43307
  16. map[name:ccmouse course:golang site:imooc quality:notbad]
  17. map[course:golang site:imooc quality:notbad]

前后输出对比发现name消失

综合实例:

1.寻找最长不含有重复字符串的子串

题目来自:https://leetcode.com/problems/longest-substring-without-repeating-characters/description/

题目描述如下图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvbmdzaHVhaTE5OTAwNTA1_size_16_color_FFFFFF_t_70

例子:

abcabcbb->abc //最长的就是abc

bbbbb->b //最长为b

pwwkew->pwke //最长为pwke

算法描述:

对于每一个字母x

1)lastOccurred[x](字母x在字符串中最后出现的位置)不存在,或者无需操作

2)lastOccurred[x] >= start ->更新start

3) 更新lastOccurred[x],更新maxLength

  1. package main
  2. import "fmt"
  3. func getStringLength(s string) int {
  4. lastOccurred := make(map[byte]int)
  5. start := 0//这就相当于一个游标,始终记录的时当前字符串的遍历位置
  6. maxLength := 0//记录的是已经查找过的不重复的字符串子串的长度
  7. for i, ch := range []byte(s) {
  8. lastI, ok := lastOccurred[ch]
  9. if ok && lastI >= start {
  10. start = lastI + 1
  11. }
  12. if i-start+1 > maxLength {
  13. maxLength = i - start + 1
  14. }
  15. lastOccurred[ch] = i
  16. }
  17. return maxLength
  18. }
  19. func main() {
  20. fmt.Println(getStringLength("abcabcbb"))
  21. fmt.Println(getStringLength("bbbbb"))
  22. fmt.Println(getStringLength("pwwkew"))
  23. }
  24. 输出:
  25. API server listening at: 127.0.0.1:36778
  26. 3
  27. 1
  28. 3

发表评论

表情:
评论列表 (有 0 条评论,422人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Go语言学习、Map结构

    前面我们学习了Go语言中的数组,切片类型。但是我们发现使用数组或切片存储的数据量如果比较大,那么通过下标来取出某个具体数据的时候,相对来说比较麻烦。 我们在数组或是切片中取值

    相关 GO语言笔记--map

    1.说明 1)类似其他语言中的哈希表或者字典,以key-value形式存储数据 2)key必须是支持==或!=比较运算的类型,不可以是函数、map或slice 3)m

    相关 GO语言笔记--函数

    1.函数function 1)Go函数不支持嵌套、重载和默认参数 2)但支持以下特性:无需声明原型、不定长参数、多返回值、命名返回值参数、匿名函数、闭包 3)定义函数