GO語言筆記--map

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進行迭代操作

 

 

實例:

package main


import (
    "fmt"
)

func main() {
    m1 := map[int]string{1: "a", 2: "b", 3: "c", 4: "d", 5: "e",
        6: "f", 7: "g", 8: "h", 9: "i", 0: "j"}
    fmt.Println("m1", m1)
    m2 := make(map[string]int)
    for i, v := range m1 {
        m2[v] = i
    }
    fmt.Println("m2", m2)
}

輸出:
API server listening at: 127.0.0.1:47449
m1 map[2:b 1:a 3:c 4:d 5:e 6:f 7:g 8:h 9:i 0:j]
m2 map[a:1 c:3 d:4 f:6 g:7 j:0 b:2 h:8 e:5 i:9]

實例二

package main

import "fmt"

func main() {
    m := map[string]string{
        "name": "ccmouse",
        "course": "golang",
        "site": "imooc",
        "quality": "notbad",
    }

    fmt.Println(m)
    //定義一個空map
    m2 := make(map[string]int) //m2 == empty map
    var m3 map[string]int // m3 == nil
    fmt.Println(m2, m3)

    //map遍歷
    for k, v := range m {
        fmt.Println(k, v)
    }
}
輸出:
API server listening at: 127.0.0.1:45987
map[name:ccmouse course:golang site:imooc quality:notbad]
map[] map[]
quality notbad
name ccmouse
course golang
site imooc

上述對m的輸出前後順序不一樣,這是因爲map在內存中是無序的

3.獲取變量

package main

import "fmt"

func main() {
    m := map[string]string{
        "name": "ccmouse",
        "course": "golang",
        "site": "imooc",
        "quality": "notbad",
    }

    courseName := m["course"]
    fmt.Println(courseName)
    cName := m["cour"]
    fmt.Println(cName)
    fmt.Println("end")
}
輸出:
API server listening at: 127.0.0.1:37028
golang
end

上述代碼尤其注意k值拼寫錯誤並不會報錯,只是輸出爲空,這是因爲零值,那麼如何判斷K值是否存在呢,看下面代碼,獲取時候獲取一個狀態就好了

package main

import "fmt"

func main() {
    m := map[string]string{
        "name": "ccmouse",
        "course": "golang",
        "site": "imooc",
        "quality": "notbad",
    }

    if courseName, ok := m["course"]; ok {
        fmt.Println(courseName)
    } else {
        fmt.Println("course key does not exit")
    }

    if cName, ok := m["cour"]; ok {
        fmt.Println(cName)
    } else {
        fmt.Println("cour key does not exit")
    }
}
輸出:
API server listening at: 127.0.0.1:28373
golang
cour key does not exit

可以看出course存在直接輸出,cour不存在則報錯

 

4.刪除

package main

import "fmt"

func main() {
    m := map[string]string{
        "name": "ccmouse",
        "course": "golang",
        "site": "imooc",
        "quality": "notbad",
    }

    fmt.Println(m)
    delete(m, "name")
    fmt.Println(m)
}
輸出:
API server listening at: 127.0.0.1:43307
map[name:ccmouse course:golang site:imooc quality:notbad]
map[course:golang site:imooc quality:notbad]

前後輸出對比發現name消失

 

綜合實例:

1.尋找最長不含有重複字符串的子串

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

題目描述如下圖:

例子:

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

bbbbb->b //最長爲b

pwwkew->pwke //最長爲pwke

 

算法描述:

對於每一個字母x

1)lastOccurred[x](字母x在字符串中最後出現的位置)不存在,或者<start(起始位置)->無需操作

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

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

package main

import "fmt"

func getStringLength(s string) int {
    lastOccurred := make(map[byte]int)
    start := 0//這就相當於一個遊標,始終記錄的時當前字符串的遍歷位置
    maxLength := 0//記錄的是已經查找過的不重複的字符串子串的長度
    for i, ch := range []byte(s) {
        lastI, ok := lastOccurred[ch]
        if ok && lastI >= start {
            start = lastI + 1
        }

        if i-start+1 > maxLength {
            maxLength = i - start + 1
        }
        lastOccurred[ch] = i
    }
    return maxLength
}

func main() {
    fmt.Println(getStringLength("abcabcbb"))
    fmt.Println(getStringLength("bbbbb"))
    fmt.Println(getStringLength("pwwkew"))
}
輸出:
API server listening at: 127.0.0.1:36778
3
1
3

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章