4week-5map
数组,切片,map ,遍历效率都不高,时间复杂度O(n)和n有关,规模越大越耗时间
线性表:使用index效率高,
map使用key定位效率高
map的key是无序的,即使你看到了好像是有顺序,不要当真,key不排序,value也不排序
map开辟内存中.房间编号,和地址是连续的
一.map定义2种方式
1.字面量定义--->适用于使用数据量小
- 语法
func main() {
var m1 = map[int]string{
1: "abc",
2: "xyz",
100: "t",
}
fmt.Println(
// len显示k,v的对数
m1 == nil, len(m1) //不可以使用cap,因为map的hash表空间是go自己维护的,不让程序员看
)
}
2.make
func main() {
m2 := make(map[string]int, 10)
fmt.Println(
m1 == nil, len(m1), m2,
)
}
字面量定义2
func main() {
heroes := map[string]string{
"a": "1",
}
fmt.Printf("heroes: %v\n", heroes)
}
二.增删改查
1.新增
m1["100"] = 200 //新增100="100" len(+1) ;用字符串100 哈希计算出房间号,往链表里面塞200
fmt.Println(m1)
2查
- 用字符串100 哈希计算出房间号,-->遍历链表-->取对应的值200
- 查找的时候是用key 找到的key捆绑的值,搜索速度 O(1)
fmt.Println(m1["100"]) //输出的时候.也要k,v的类型输出
1. 对于不知道是否存在的key,需要判断返回值
fmt.Println(m1["2"]) //也可以打印没有的内容,会输出零值
// 返回值判断方法1
//ok返回bool值,true是存在,flase是不存在
v, ok := m1["1"]
if !ok {
fmt.Println("key不存在", v) //不存在,v是0值
} else {
fmt.Println("存在", v) //存在v就是key
}
// 返回值判断方法2
if v, ok := m1["1"]; !ok {
fmt.Println("key不存在", v)
} else {
fmt.Println("存在", v)
}
3.修改
m1["1"] = 1 //创建k,v对,不存在就创建,存在就修改
//覆盖
m1["1"] += 1 //找k是["1"] + 1
fmt.Println(m1)
//继续增加
m1["zhangsan"] = 32
m1["lisi"] = 88
fmt.Println(m1)
4.删除
//删除
delete(m1, "john5") //如果key不存在,不报错
delete(m1, "lisi") //通过 lisi这个key,通过hash计算到房间,找到v,删除k,v对
fmt.Println(m1)
}
三.遍历
for k, v := range m1 {
fmt.Println(k, v)
}
四.// sort.Ints升序排序
// sort.Ints升序排序
//就地排序,修改当前序列,节省空间
func main() {
a := []int{1, 3, 5, 4, 6}
fmt.Printf("%v,%p,%v\n", a, &a, &a[0])
sort.Ints(a) //a引用类型,减少底层数组复制
sort.Sort(sort.IntSlice(a))
fmt.Printf("%v,%p %v\n", a, &a, &a[0])
b := a
fmt.Printf("%v,%p %v\n", b, &b, &a[0])
//倒叙
sort.Sort(sort.Reverse(sort.IntSlice(a)))
fmt.Println(a)
}
五.map的值是map
package main
import "fmt"
func main() {
studentMap := make(map[string]map[string]string)
studentMap["stu01"] = make(map[string]string, 2)
studentMap["stu01"]["name"] = "jack"
studentMap["stu01"]["age"] = "男"
studentMap["stu02"] = make(map[string]string, 2)
studentMap["stu02"]["name"] = "john4"
studentMap["stu02"]["age"] = "100"
fmt.Println(studentMap)
}
六.切片的元素是map
演示一个key :value
的value
是 key:value
map
package main
import "fmt"
func main() {
//定义一个map key是stu01; 值是map
studentMap := make(map[string]map[string]string)
//2.给key的value map初始化
studentMap["stu01"] = make(map[string]string, 2)
//3. 给key的key 的value赋值
studentMap["stu01"]["name"] = "jack"
studentMap["stu01"]["age"] = "男"
studentMap["stu02"] = make(map[string]string, 2)
studentMap["stu02"]["name"] = "john4"
studentMap["stu02"]["age"] = "100"
//4.打印key,显示值是map键值对
fmt.Println(studentMap["stu02"]) //map[age:100 name:john4]
fmt.Println(studentMap["stu02"]["age"]) //100
}
七. 切片的元素是map
package main
import "fmt"
func main() {
//1.声明1个切片,切片的类型是map
//2.make初始化切片,长度和容量都是2
m := make([]map[string]string, 2)
fmt.Println(len(m), cap(m))
//3.判断切片0元素是否为空,如果是空,那么给0元素赋值
if m[0] == nil {
m[0] = make(map[string]string) //初始化切片中的元素map
m[0]["name"] = "sb"
fmt.Printf("%p\n", &m[0]) //0xc00003e250没有扩容
m[1] = make(map[string]string) //0xc00003e250没有扩容
m[1]["gender"] = "男"
fmt.Printf("%p\n", &m[0])
}
// fmt.Println(m[0], m[1]) //[map[name:sb] map[gender:男]]
//3.创建新map给切片追加进去
newm := make(map[string]string)
newm["name"] = "张三"
newm["gerder"] = "男"
m = append(m, newm)
fmt.Println(m) //[map[name:sb] map[gender:男] map[gerder:男 name:张三]]
fmt.Printf("%p\n", &m[0]) //0xc000024400扩容了
}
八.map排序
package main
import (
"fmt"
"sort"
)
func main() {
map1 := make(map[int]string)
map1[13] = "苹果"
map1[2] = "香蕉"
map1[3] = "梨"
map1[4] = "葡萄"
fmt.Println(map1)
var keys []int
for k, _ := range map1 {
keys = append(keys, k)
}
sort.Ints(keys)
fmt.Println(keys)
for _, k := range keys {
fmt.Println(k, map1[k])
}
}
九.map的值是结构体
package main
import "fmt"
func main() {
//1.创建1个结构体
type stu struct {
name string
age int
adderss string
}
// 2.创建1个map值是结构体
students := make(map[string]stu, 10)
//3.实例化2个学生
stu1 := stu{"tom", 18, "北京"}
stu2 := stu{"manary", 28, "北京"}
//4.把结构体赋值给map
students["no1"] = stu1
students["no1"] = stu2
fmt.Println(students)
fmt.Println(students["no1"].adderss)
}
func TestMultiSepSplit(t *testing.T) {
type test struct {
str string
sep string
want []string
}
// m2 := make(map[string]int, 10)
tests := make(map[string]test)
// tests["noraml"] = test{"a,b,c", ",", []string{"a", "b", "c"}},
tests["sbs"] = test{"a,b,c", ",", []string{"a", "b", "c"}}
fmt.Printf("tests: %v\n", tests)