Go语言中的Map和List实现有序Map
Go语言中的Map和List实现有序Map
Map定义:
Go 中 Map是一种无序的键值对的集合。Map最重要的一点是通过key来快速检索数据,key类似于索引,指向数据的值。Map是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map是无序的,我们无法决定它的返回顺序,这是因为Map是使用链式hash表来实现的。
其他语言中的实现:
在C++ STL 中map 采用红黑树实现,可以实现有序的Map.
在PHP中,Array就是一个有序的map
Go 中实现:
type MapList struct {dataMap map[string]*list.ElementdataList *list.List
}
这个实现方法的主要的方法是用空间换取时间。通过list 和 map 两种数据结构,保存相同的一份数据。list 用来做顺序遍历,map 用来做查找,删除操作。
为了把对象保存到 map中,我们还需要定义一个接口
type Keyer interface {GetKey() string
}
主要实现代码如下:
package mainimport ("container/list""fmt"
)type Keyer interface {GetKey() string
}type MapList struct {dataMap map[string]*list.ElementdataList *list.List
}func NewMapList() *MapList {return &MapList{dataMap: make(map[string]*list.Element),dataList: list.New(),}
}func (mapList *MapList) Exists(data Keyer) bool {_, exists := mapList.dataMap[string(data.GetKey())]return exists
}func (mapList *MapList) Push(data Keyer) bool {if mapList.Exists(data) {return false}elem := mapList.dataList.PushBack(data)mapList.dataMap[data.GetKey()] = elemreturn true
}func (mapList *MapList) Remove(data Keyer) {if !mapList.Exists(data) {return}mapList.dataList.Remove(mapList.dataMap[data.GetKey()])delete(mapList.dataMap, data.GetKey())
}func (mapList *MapList) Size() int {return mapList.dataList.Len()
}func (mapList *MapList) Walk(cb func(data Keyer)) {for elem := mapList.dataList.Front(); elem != nil; elem = elem.Next() {cb(elem.Value.(Keyer))}
}type Elements struct {value string
}func (e Elements) GetKey() string {return e.value
}func main() {fmt.Println("Starting test...")ml := NewMapList()var a, b, c Keyera = &Elements{"Alice"}b = &Elements{"Bob"}c = &Elements{"Conrad"}ml.Push(a)ml.Push(b)ml.Push(c)cb := func(data Keyer) {fmt.Println(ml.dataMap[data.GetKey()].Value.(*Elements).value)}fmt.Println("Print elements in the order of pushing:")ml.Walk(cb)fmt.Printf("Size of MapList: %d \n", ml.Size())ml.Remove(b)fmt.Println("After removing b:")ml.Walk(cb)fmt.Printf("Size of MapList: %d \n", ml.Size())
}
输出结果:
Starting test...
Print elements in the order of pushing:
Alice
Bob
Conrad
Size of MapList: 3
After removing b:
Alice
Conrad
Size of MapList: 2
优点:
红黑树的插入、删除、查找的复杂度都是 O(logn), 而这个实现插入查找删除的复杂度都是 O(1), 可以说是一种非常好的数据结构。
缺点:
使用了两个数据结构,空间占用稍微大了一点。但是和树的实现比,这个占用也不算非常大。
Go语言中的Map和List实现有序Map相关推荐
- Go语言编程—Go语言中JSON的处理(map、struct 和 JSON字符串的相互转换)
JSON的简单介绍 JSON (JavaScript Object Notation)是一种比XML更轻量级的数据交换格式,在易于人们阅读和编写的同时,也易于程序解析和生成.尽管JSON是JavaSc ...
- map函数作用c语言,c语言中map的用法:map基本用法
c++中map容器提供一个键值对容器,那么你知道map的用法有哪些吗,下面秋天网 Qiutian.ZqNF.Com小编就跟你们详细介绍下c语言中map的用法,希望对你们有用. c语言中map的用法:m ...
- c语言中std::map_在现代C ++中明智地使用std :: map
c语言中std::map std::map and its siblings(std::multimap, std::unordered_map/multimap) used to be my fav ...
- map python函数_Python语言中map函数
本文主要向大家介绍了Python语言中map函数,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 1.对可迭代函数'iterable'中的每一个元素应用'function'方法,将 ...
- go语言中map的使用
一.集合(Map) 1.1 什么是Map map是Go中的内置类型,它将一个值与一个键关联起来.可以使用相应的键检索值. Map 是一种无序的键值对的集合.Map 最重要的一点是通过 key 来快速检 ...
- java 一个数组key一个数组value_在各种语言中,使用key在map中获取value 和 使用下标获取数组中的数据 相比哪个更快?...
数组和集合的效率问题数组是JAVA语言内置的数据类型,它是一个线性的序列,所以它可以快速的访问其他的元素.但是速度是要有代价的,当你创建了一个数组之后,它的容量就固定了,而且在其生命周期里是不能改变的 ...
- Java 语言中 Enum 类型的使用介绍
Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...
- java可以使用c语言中的输入,c语言中的scanf在java中应该怎么表达,Scanner类。
1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...
- go语言中append函数的使用
go语言中append处理slice 每次调用appen都会根据当前的cap对slice进行评估, 如果cap不够,就按照2倍长度进行扩容 package mainimport ("fmt& ...
最新文章
- 喻国明:“元宇宙”背后的未来图景
- RDF -- 资源描述框架
- 脑动力:C语言函数速查效率手册(附DVD光盘1张) [平
- HTTP:HTTP的server and client详细攻略
- Hologres揭秘:高性能原生加速MaxCompute核心原理
- python matlabplot animate 刷新_matlab动态绘图Animation
- VC中新建的类不见了的解决方法
- python 图片转视频ffmpeg_python图片转视频(opencv),ffmpeg压缩视频
- redis源码剖析(十一)—— Redis字符串相关函数实现
- 技术优点_波纹管内衬管制造技术及优点
- python域名转ip_Python 实现域名解析为ip的方法
- Siggraph三角网格变形之三维网格拉普拉斯
- oracle12C推SCN,Oracle 的 DBMS_SCN 修正以及SCN的auto-rollover新特性
- js中的逻辑与()和逻辑或(||)(转载)
- SQL Prompt 破解教程
- 计算机开机今入dos系统,开机如何进入dos系统_如何进入纯dos系统
- 嵌入式-ADS和Proteus安装
- 计量经济学及Stata应用 陈强 第七章异方差习题7.3
- vue下载excel表格模板和导入excel表格数据
- 电子证件照怎么制作?学会这些方法不用再去照相馆