Go语言Map(集合)

Go语言Map(集合)

Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。

Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。

定义 Map

可以使用内建函数 make 也可以使用 map 关键字来定义 Map:

/* 声明变量,默认 map 是 nil */
var map_variable map[key_data_type]value_data_type

/* 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)

如果不初始化 map,那么就会创建一个 nil map。nil map 不能用来存放键值对

Map实例

package main

import "fmt"

func main() {
	m := map[string]string{
		"name": "ccmouse",
		"course": "golang",
		"site": "imooc",
		"quality": "notbad",
	}
	m2 := make(map[string]int)		// m2==empty map
	var m3 map[string] int		// m3 == nil
	fmt.Println(m, m2, m3)
	fmt.Println("Traversing map")
	for k, v := range m{
		fmt.Println(k, v)
	}
	for k := range m{
		fmt.Println(k)
	}
	for _, v := range m{
		fmt.Println(v)
	}
	fmt.Println("Getting values")
	couserName, ok := m["course"]
	fmt.Println(couserName, ok)
	// 不存在的key,会拿到一个空值
	if couserName1, ok:= m["corse"]; ok{
		fmt.Println(couserName1)
	}else{
		fmt.Println("key does not exist")
	}
	fmt.Println("Deleting values")
	if name, ok := m["name"]; ok{
		fmt.Println(name,ok)
		delete(m, "name")
	}
	name, ok := m["name"]
	fmt.Println(name,ok)
}

运行结果

map[course:golang name:ccmouse quality:notbad site:imooc] map[] map[]
Traversing map
course golang
site imooc
quality notbad
name ccmouse
name
course
site
quality
ccmouse
golang
imooc
notbad
Getting values
golang true
key does not exist
Deleting values
ccmouse true
 false

总结

  • Map的操作
    • 创建:make(map[string]int)
    • 获取元素:m[key]
    • key不存在时,获取Value类型的初始值
    • value, ok := m[key]来判断是否存在key
  • Map的遍历
    • 使用range遍历key, 或者遍历key,value
    • 不保证遍历顺序,如需顺序,需手动对key排序
    • 使用len获取元素个数
  • Map的key
    • Map使用哈希表,必须可以比较相等
    • 除了slicemapfunction的内建类型都可以作为key
    • Struct类型不包含上述字段,也可以作为key

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

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

package main

import "fmt"

func lengthOfNonRepeatingSubStr(s string) int {
	last0ccurred := make(map[rune]int)
	start := 0
	maxLength := 0
	for i, ch := range []rune(s){
		if lastI, ok := last0ccurred[ch]; ok && lastI >= start{
			start = lastI + 1
		}
		if i - start + 1 > maxLength{
			maxLength = i - start + 1
		}
		last0ccurred[ch] = i
	}
	return maxLength
}

func main() {
	fmt.Println(lengthOfNonRepeatingSubStr("abcabcbb"))
	fmt.Println(lengthOfNonRepeatingSubStr("bbbbb"))
	fmt.Println(lengthOfNonRepeatingSubStr("pwwkew"))
	fmt.Println(lengthOfNonRepeatingSubStr(""))
	fmt.Println(lengthOfNonRepeatingSubStr("b"))
	fmt.Println(lengthOfNonRepeatingSubStr("abcdef"))
	fmt.Println(lengthOfNonRepeatingSubStr("这里是慕课网"))
	fmt.Println(lengthOfNonRepeatingSubStr("一二三二一"))
}

运行结果

3
1
3
0
1
6
6
3

对于每一个字母x

  • lastOccurred[x]不存在,或者<start → 无需操作
  • lastOccurred[x]>=start→更新start
  • 更新lastOccurred[x],更新maxlength

字符串

package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	// UTF-8
	s := "Yes我爱慕课网!"
	fmt.Println(s)
	// 19 字节数
	fmt.Println(len(s))
	// Yes我爱慕课网!
	fmt.Printf("%s\n", []byte(s))
	// 596573E68891E788B1E68595E8AFBEE7BD9121
	fmt.Printf("%X\n", []byte(s))
	for _, b := range []byte(s){
		fmt.Printf("%X ", b)
	}
	fmt.Println()
	for i, ch := range s{ // ch is a rune
		fmt.Printf("(%d %X)", i, ch)
	}
	fmt.Println()
	// utf8.RuneCountInString获得字符串数量
	fmt.Println("Rune count:", utf8.RuneCountInString(s))
	// 获得所有的字节
	bytes := []byte(s)
	for len(bytes) > 0{
		ch, size := utf8.DecodeRune(bytes)
		bytes = bytes[size:]
		fmt.Printf("%c ", ch)
	}
	fmt.Println()
	for i, ch := range []rune(s){
		fmt.Printf("(%d %c)", i, ch)
	}
	fmt.Println()
}

运行结果

Yes我爱慕课网!
19
Yes我爱慕课网!
596573E68891E788B1E68595E8AFBEE7BD9121
59 65 73 E6 88 91 E7 88 B1 E6 85 95 E8 AF BE E7 BD 91 21 
(0 59)(1 65)(2 73)(3 6211)(6 7231)(9 6155)(12 8BFE)(15 7F51)(18 21)
Rune count: 9
Y e s 我 爱 慕 课 网 ! 
(0 Y)(1 e)(2 s)(3 我)(4 爱)(5 慕)(6 课)(7 网)(8 !)

Go语言中的字符串的常见操作

  • strings.HasPrefix(s string, prefix string) 返回值类型:bool:判断字符串s是否以prefix开头
  • strings.HasSuffix(s string, suffix string) 返回值类型:bool:判断字符串s是否以suffix结尾。
  • strings.Index(s string, str string)返回值类型:int:判断str在s中首次出现的位置,如果没有出现,则返回-1
  • strings.LastIndex(s string, str string)返回值类型int:判断str在s中最后出现的位置,如果没有出现,则返回-1
  • strings.Replace(str string, old string, new string, n int):字符串替换
  • strings.Count(str string, substr string)返回值类型:int:字符串计数
  • strings.Repeat(str string, count int)返回值类型:string:重复count次str
  • strings.ToLower(str string)返回值类型:string:转为小写
  • strings.ToUpper(str string)返回值类型:string:转为大写
  • strings.TrimSpace(str string):去掉字符串首尾空白字符
  • strings.Trim(str string, cut string):去掉字符串首尾cut字符
  • strings.TrimLeft(str string, cut string):去掉字符串首cut字符
  • strings.TrimRight(str string, cut string):去掉字符串首cut字符
  • strings.Field(str string):返回str空格分隔的所有子串的slice
  • strings.Split(str string, split string) 返回值类型:[]string:返回str split分隔的所有子串的slice
  • strings.Join(s1 []string, sep string):用sep把s1中的所有元素链接起来
  • strings.Itoa(i int):把一个整数i转成字符串
  • strings.Atoi(str string)(int, error):把一个字符串转成整数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值