首页 > 编程知识 正文

有序的map,go语言什么时候使用map

时间:2023-05-05 04:14:33 阅读:25702 作者:3302

GO地图介绍

Go的映射是无序的键-值对的集合。 Map最重要的一点是用key快速搜索数据。 key就像索引,指向数据的值。 Map是一种集合,因此可以重复数组和切片。 但是,映射是无序的,无法决定返回的顺序。 这是因为Map是使用链式混列表实现的。

在c中实现

在C STL中,映射用红黑树实现,可以实现有序的映射。

通过Go实现

实现原理

这种实现方法的主要方法是交换空间和时间。 list和map两种类型的数据结构,存储同一数据。 list用于顺序扫描,map用于检索、删除操作

实现代码

包主

导入(

' container/list '

' fmt '

类型密钥接口{

GetKey ()字符串

}

类型映射结构{

datamapmap [字符串] * list.element

dataList *list.List

}

funcnewmaplist(*maplist{

返回映射{

data map : make (map [字符串] * list.element )、

dataList: list.New ()、

}

}

func(maplist*maplist ) exists (数据密钥) bool {

_,exists :=maplist.data map [ string (data.getkey ()

返回退出

}

func(maplist*maplist ) push (数据密钥) bool {

ifmaplist.exists(data ) {

返回假

}

elem :=maplist.datalist.push back (data )

maplist.data map [ data.getkey ()=elem

返回真

}

maplist * maplist (func ) remove (数据密钥)

if! maplist.exists(data ) {

返回

}

maplist.datalist.remove (maplist.data map [ data.getkey ()

Delete(maplist.datamap,data.GetKey ) )

}

func(maplist*maplist ) Size ) int {

return mapList.dataList.Len (

}

func(maplist*maplist ) walk (CB func (数据密钥) )

for elem :=maplist.datalist.front (; 雷姆!=nil; elem=elem.Next (

CB(Elem.value.(Keyer ) ) ) ) ) ) )。

}

}

类型元素结构{

值字符串

}

func(eelements ) GetKey ) ) string {

return e.value

}

func main () }

fmt.println (开始测试. ) )。

ml :=新maplist (

var a,b,c Keyer

a=Elements{'sxdhm'}

b=Elements{'Bob'}

c=Elements{'Conrad'}

是ml.push(a )

是ml.push(b )

是ml.push(c )

CB :=func (数据密钥) {

fmt.println (ml.data map [ data.getkey ().value.(* elements ).value

}

fmt.println (printelementsintheorderofpushing : ) )。

是ml.walk(CB )

fmt.printf (sizeof maplist : % d (n ),ml.Size ) )

是ml.remove(b )

fmt.println (afterremovingb : ) )。

是ml.walk(CB )

fmt.printf (sizeof maplist : % d (n ),ml.Size ) )

}

好处

插入、删除、检索红黑树的复杂度都是o(logn ),而该实现的插入、检索、删除复杂度都是o (o ) 1,可以说是非常好的数据结构。

缺点

因为使用了两个数据结构,所以空间稍微变大了。 但是,与树的实现相比,这种占有也不是很大

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。