golang对map进行排序

本文中的go版本:go version go1.17.12 windows/amd64

一、前言

在go语言中 map数据类型的底层实现是哈希表,它能够将特定类型的key映射到特定类型的value上。在查询map里面的内容时 其时间复杂度为O(1)非常高效。但其存储并不是线性的 所以对map遍历输出时 也没有顺序可言。如果需要按特定的顺序输出map中的值的话 就需要借助其他数据结构的帮助。

  • go语言中 没有专门的map排序相关函数。
  • go语言中的map默认是无序的,也不是按照添加的顺序存放的,每次遍历map的时候 得到的输出结果可能都跟之前是不一样的。
  • go语言中的map排序 如果针对的是简单的 key、value 的形式的话:可以先将map中的所有的key放到一个slice(切片)当中 然后将slice进行排序。最后 遍历排序后的slice 按照key来输出map对应的value值 即可完成对map类型的数据进行排序。

对map进行排序 代码如下(从小到大 按照升序进行排序):

func main () {

	maps := map[int]string{
		4: "星期四",
		3: "星期三",
		1: "星期一",
		6: "星期六",
		2: "星期二",
		7: "星期天",
		5: "星期五",
	}

	//1.将maps中的的所有key放到一个slice切片中
	var keys = make([]int, 0)
	
	for k, _ := range maps {
		keys = append(keys, k)
	}

	//2.对切片排序。如果key的类型是字符串 可以使用sort.Strings(keys)
	sort.Ints(keys) //将keys按照从小到大的顺序 进行升序排序

	//3.遍历切片,然后按key来输出map的值
	for _, key := range keys{
		fmt.Printf("[%v]=%v \n", key, maps[key])
	}

}

对map进行排序 代码如下(从大到小 按照降序进行排序):

func main () {

	maps := map[int]string{
		4: "星期四",
		3: "星期三",
		1: "星期一",
		6: "星期六",
		2: "星期二",
		7: "星期天",
		5: "星期五",
	}

	//1.将maps中的的所有key放到一个slice切片中
	var keys = make([]int, 0)

	for k, _ := range maps {
		keys = append(keys, k)
	}
	
	sort.Slice(keys, func(i, j int) bool {
		return keys[i] > keys[j]
	})

	for _, key := range keys{
		fmt.Printf("[%v]=%v \n", key, maps[key])
	}

}

二、关于sort包中的Slice()函数相关介绍

sort.Ints()、sort.Strings()等方法都是按升序排序的,如果我们希望按降序排序就需要我们自定义排序规则。

go语言在sort包中提供了 sort.Slice()函数进行更为简便的排序方法。

sort.Slice() 函数只要求传入需要排序的数据,以及一个排序时对元素的回调函数。

用法如下:

 //第一个参数tmp:是要排序的数据、第二个形参是:排序判断方法,其中 形参i 代表后一个元素 形参j 代表前一元素 返回值:代表i,j是否交换。true:交换,false:不交换。
sort.Slice(tmp,func(i,j int){ 
        return tmp[i] < tmp[j]
    })

具体使用示例代码如下:


package main

import (
	"fmt"
	"sort"
)

func main() {
	
	a := []int{6, 3, 9, 8, 1, 2, 5, 7}

	sort.Slice(a, func(i, j int) bool {
		return a[i] > a[j]
	})

	fmt.Println(a) //输出:[9 8 7 6 5 3 2 1]
}


本文完。


声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

小周博客
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复 0人评论 7,777人参与

loading