Go语言map排序(key/value排序)

101 篇文章 5 订阅
本文详细介绍了如何在Go语言中对map进行有序遍历,包括按key从小到大和从大到小排序,以及按value从小到大和从大到大的排序方法。通过示例代码展示了具体的实现步骤,帮助读者理解如何在Go中实现map的有序遍历。
摘要由CSDN通过智能技术生成

1、前言

Go语言的map是无序的,多次遍历map的结果可能是不同的,比如:

package main

import (
	"fmt"
)

func Map() (result map[int]uint32) {
	result = map[int]uint32{}
	// 插入各个数据
	result[24] = 240
	result[17] = 170
	result[9] = 90
	result[11] = 110
	result[55] = 550
	return
}
func main() {
	mapResult := Map()
	// 遍历map
	for key, value := range mapResult {
		fmt.Printf("key = %v,value = %v\n", key, value)
	}
}

第一次遍历结果如下:
在这里插入图片描述
第二次遍历结果如下:
在这里插入图片描述
可以看到两次遍历的结果是不同的

2、实现map遍历有序

2.1 key有序

思路:对key排序,再遍历key输出value

2.1.1 从小到大排序

sort.Sort(sort.IntSlice(keys))

代码如下:

package main

import (
	"fmt"
	"sort"
)

func Map() (result map[int]uint32, keys []int) {
	result = map[int]uint32{}
	keys = []int{}
	// 插入各个数据
	result[24] = 240
	result[17] = 170
	result[9] = 90
	result[11] = 110
	result[55] = 550
	// 得到各个key
	for key := range result {
		keys = append(keys, key)
	}
	// 给key排序,从小到大
	sort.Sort(sort.IntSlice(keys))
	return
}
func main() {
	mapResult, keys := Map()
	// 遍历map
	for _, key := range keys {
		fmt.Printf("key = %v,value = %v\n", key, mapResult[key])
	}
}

结果:
在这里插入图片描述

2.1.2 从大到小排序

sort.Sort(sort.Reverse(sort.IntSlice(keys)))

代码如下:

package main

import (
	"fmt"
	"sort"
)

func Map() (result map[int]uint32, keys []int) {
	result = map[int]uint32{}
	keys = []int{}
	// 插入各个数据
	result[24] = 240
	result[17] = 170
	result[9] = 90
	result[11] = 110
	result[55] = 550
	// 得到各个key
	for key := range result {
		keys = append(keys, key)
	}
	// 给key排序,从大到小
	sort.Sort(sort.Reverse(sort.IntSlice(keys)))
	return
}
func main() {
	mapResult, keys := Map()
	// 遍历map
	for _, key := range keys {
		fmt.Printf("key = %v,value = %v\n", key, mapResult[key])
	}
}

结果:
在这里插入图片描述

2.2 value有序

用struct存放key和value,实现sort接口,就可以调用sort.Sort进行排序了

2.2.1 从小到大排序

package main

import (
	"fmt"
	"sort"
)

func main() {
	mapInfo := map[string]int32{
		"roy":18,
		"kitty":16,
		"hugo":21,
		"tina":35,
		"jason":23,
	}

	type peroson struct {
		Name string
		Age int32
	}

	var lstPerson []peroson
	for k, v := range mapInfo {
		lstPerson = append(lstPerson, peroson {k, v})
	}

	sort.Slice(lstPerson, func(i, j int) bool {
		return lstPerson[i].Age < lstPerson[j].Age  // 升序
	})
	fmt.Println(lstPerson)
}

结果:
在这里插入图片描述

2.2.2 从大到小排序

package main

import (
	"fmt"
	"sort"
)

func main() {
	mapInfo := map[string]int32{
		"roy":   18,
		"kitty": 16,
		"hugo":  21,
		"tina":  35,
		"jason": 23,
	}

	type peroson struct {
		Name string
		Age  int32
	}

	var lstPerson []peroson
	for k, v := range mapInfo {
		lstPerson = append(lstPerson, peroson{k, v})
	}

	sort.Slice(lstPerson, func(i, j int) bool {
		return lstPerson[i].Age > lstPerson[j].Age // 降序
	})
	fmt.Println(lstPerson)
}

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跳舞的皮埃尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值