golang有序map_go语言发展不起来

golang有序map_go语言发展不起来Go语言中的Map和List实现有序MapMap定义:Go中Map是一种无序的键值对的集合。Map最重要的一点是通过key来快速检索数据,key类似于索引,指向数据的值。Map是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map是无序的,我们无法决定它的返回顺序,这是因为Map是使用链式hash表来实现的。其他语言中的实现:在C++STL中map采用红黑树实现,…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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.Element
    dataList	*list.List
}

这个实现方法的主要的方法是用空间换取时间。通过list 和 map 两种数据结构,保存相同的一份数据。list 用来做顺序遍历,map 用来做查找,删除操作。

为了把对象保存到 map中,我们还需要定义一个接口

type Keyer interface {
    GetKey() string
}

主要实现代码如下:

package main

import (
	"container/list"
	"fmt"
)

type Keyer interface {
	GetKey() string
}

type MapList struct {
	dataMap  map[string]*list.Element
	dataList *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()] = elem
	return 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 Keyer
	a = &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), 可以说是一种非常好的数据结构。

缺点:

使用了两个数据结构,空间占用稍微大了一点。但是和树的实现比,这个占用也不算非常大。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/193192.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Windows下创建自定义服务的正确姿势(Instrsrv&Srvany)「建议收藏」

    Windows下创建自定义服务的正确姿势(Instrsrv&Srvany)「建议收藏」总览WindowsNT工具包(WindowsNTResourceKit)提供了两个小工具,可以让我们创建自定义服务(适合于NT应用和一些16进制应用,批处理除外)。两个工具包的下载地址:CSDN下载Instrsrv.exe:从系统安装和移除服务Srvany.exe:主要作用是将任何应用程序处理成为一个可以作运行的服务明细步骤按照以下步骤操作,来创建用户自定义服务:(为…

  • 免费ASP空间

    免费ASP空间free免费asp空间的申请方法;free免费asp空间的ftp使用方法;sise.host3v.vip/1

  • pycharmlinux安装教程_怎么安装pycharm及环境变量配置

    pycharmlinux安装教程_怎么安装pycharm及环境变量配置1.在官网下载pycharm安装包1.1进入官网:DownloadPyCharm:PythonIDEforProfessionalDevelopersbyJetBrains,选择Professional专业版,直接下载;【自己可以选择pycharm的不同版本】1.2进入跳转页面后,出现提示框,点savefile;1.3下载完成后,打开安装包下载的位置;2.安装pycharm2.1解压文件2.打开终端,进入pych…

  • 高级面试题–SpringBoot启动流程解析「建议收藏」

    高级面试题–SpringBoot启动流程解析「建议收藏」写在前面:由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图keepRunning方法)。本文以调试一个实际的SpringBoot启动程序为例,参考流程中主要类类图,来分析其启动逻辑和自动化配置原理。总览:上图为SpringBoot启动结构图,我们发现启动流程…

  • JSON数组转Java List

    JSON数组转Java List本文使用alibaba开源项目fastjson与SourceForge开源项目JSON-lib两种方法转换json。现有json文件user.json如下:[{“userid”:”309BCCE3-8525-4D33-9856-5084E24FD96F”,”username”:”林梦”,”password”:”19bdec7440acd44c669

  • 前端vue面试题2020及答案_c++ 面试题

    前端vue面试题2020及答案_c++ 面试题总结出来的Vue面试题,持续更新…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号