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 :valuevaluekey:valuemap

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)
posted @ 2023-01-13 00:17  john5的博客  阅读(9)  评论(0编辑  收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css