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相关推荐

  1. Go语言编程—Go语言中JSON的处理(map、struct 和 JSON字符串的相互转换)

    JSON的简单介绍 JSON (JavaScript Object Notation)是一种比XML更轻量级的数据交换格式,在易于人们阅读和编写的同时,也易于程序解析和生成.尽管JSON是JavaSc ...

  2. map函数作用c语言,c语言中map的用法:map基本用法

    c++中map容器提供一个键值对容器,那么你知道map的用法有哪些吗,下面秋天网 Qiutian.ZqNF.Com小编就跟你们详细介绍下c语言中map的用法,希望对你们有用. c语言中map的用法:m ...

  3. 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 ...

  4. map python函数_Python语言中map函数

    本文主要向大家介绍了Python语言中map函数,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 1.对可迭代函数'iterable'中的每一个元素应用'function'方法,将 ...

  5. go语言中map的使用

    一.集合(Map) 1.1 什么是Map map是Go中的内置类型,它将一个值与一个键关联起来.可以使用相应的键检索值. Map 是一种无序的键值对的集合.Map 最重要的一点是通过 key 来快速检 ...

  6. java 一个数组key一个数组value_在各种语言中,使用key在map中获取value 和 使用下标获取数组中的数据 相比哪个更快?...

    数组和集合的效率问题数组是JAVA语言内置的数据类型,它是一个线性的序列,所以它可以快速的访问其他的元素.但是速度是要有代价的,当你创建了一个数组之后,它的容量就固定了,而且在其生命周期里是不能改变的 ...

  7. Java 语言中 Enum 类型的使用介绍

    Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...

  8. java可以使用c语言中的输入,c语言中的scanf在java中应该怎么表达,Scanner类。

    1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...

  9. go语言中append函数的使用

    go语言中append处理slice 每次调用appen都会根据当前的cap对slice进行评估, 如果cap不够,就按照2倍长度进行扩容 package mainimport ("fmt& ...

最新文章

  1. 喻国明:“元宇宙”背后的未来图景
  2. RDF -- 资源描述框架
  3. 脑动力:C语言函数速查效率手册(附DVD光盘1张) [平
  4. HTTP:HTTP的server and client详细攻略
  5. Hologres揭秘:高性能原生加速MaxCompute核心原理
  6. python matlabplot animate 刷新_matlab动态绘图Animation
  7. VC中新建的类不见了的解决方法
  8. python 图片转视频ffmpeg_python图片转视频(opencv),ffmpeg压缩视频
  9. redis源码剖析(十一)—— Redis字符串相关函数实现
  10. 技术优点_波纹管内衬管制造技术及优点
  11. python域名转ip_Python 实现域名解析为ip的方法
  12. Siggraph三角网格变形之三维网格拉普拉斯
  13. oracle12C推SCN,Oracle 的 DBMS_SCN 修正以及SCN的auto-rollover新特性
  14. js中的逻辑与()和逻辑或(||)(转载)
  15. SQL Prompt 破解教程
  16. 计算机开机今入dos系统,开机如何进入dos系统_如何进入纯dos系统
  17. 嵌入式-ADS和Proteus安装
  18. 计量经济学及Stata应用 陈强 第七章异方差习题7.3
  19. vue下载excel表格模板和导入excel表格数据
  20. 电子证件照怎么制作?学会这些方法不用再去照相馆

热门文章

  1. peewee 操作mysql_peewee 数据库操作
  2. n*n蛇形方阵的输出
  3. 游戏服务器的那些事儿
  4. java递归红与黑答案,递归--红与黑
  5. 旺旺qq html,如何在网页HTML中嵌入QQ、MSN、旺旺、Gtalk快速对话框代码
  6. android n 状态栏分析,Android N状态栏图标白底问题
  7. vr旅游市场竞争分析,破局之路在何方?
  8. Django计算机毕业设计交通违章举报平台(程序+lw)Python
  9. 如何选择靠谱的插画培训课程
  10. Django建立一个音乐网站(一)