字典
最后更新于:2022-04-02 04:10:54
[TOC]
## 概述
字典是存储键值对的数据结构,把一个键和一个值映射起来,一一映射,键不能重复。在某些教程中,这种结构可能称为符号表,关联数组或映射
字典的实现有两种方式:**哈希表`HashTable`和红黑树`RBTree`**
## go实现 set(不可重复集合)
使用一个容量为`cap`的`map`来实现不可重复集合,`map`的值我们不使用,所以值定义为空结构体`struct{}`,因为**空结构体不占用内存空间**
```
// 集合结构体
type Set struct {
m map[int]struct{} // 用字典来实现,因为字段键不能重复
len int // 集合的大小
sync.RWMutex // 锁,实现并发安全
}
// 新建一个空集合
func NewSet(cap int64) *Set {
temp := make(map[int]struct{}, cap)
return &Set{
m: temp,
}
}
```
## 实现
main.go
```
package main
import (
"fmt"
"sync"
)
type Set struct {
m map[int]struct{}
len int
mu sync.Mutex
}
func NewSet(cap int )*Set{
return &Set{
m: make(map[int]struct{},cap),
}
}
func (s *Set)Add(n int){
s.mu.Lock()
defer s.mu.Unlock()
s.m[n]= struct{}{}
s.len++
}
func (s *Set)Remove(n int){
s.mu.Lock()
defer s.mu.Unlock()
if s.len == 0 {
return
}
delete(s.m,n)
s.len--
}
func (s *Set) Has(n int)bool{
s.mu.Lock()
defer s.mu.Unlock()
if s.len == 0 {
return false
}
_,ok:=s.m[n]
return ok
}
func (s *Set) Len()int {
return s.len
}
func (s *Set) IsEmpty()bool {
return s.len==0
}
func (s *Set) Clear(){
s.mu.Lock()
defer s.mu.Unlock()
s.m= map[int]struct{}{}
s.len=0
}
func (s *Set) List()[]int{
s.mu.Lock()
defer s.mu.Unlock()
var nums []int
for k, _ := range s.m {
nums =append(nums,k)
}
return nums
}
func main() {
//other()
// 初始化一个容量为5的不可重复集合
s := NewSet(5)
s.Add(1)
s.Add(1)
s.Add(2)
fmt.Println("list of all items", s.List())
s.Clear()
if s.IsEmpty() {
fmt.Println("empty")
}
s.Add(1)
s.Add(2)
s.Add(3)
if s.Has(2) {
fmt.Println("2 does exist")
}
s.Remove(2)
s.Remove(3)
fmt.Println("list of all items", s.List())
/**
list of all items [1 2]
empty
2 does exist
list of all items [1]
*/
}
```
';