开发者学堂课程【Go 语言核心编程 - 基础语法、数组、切片、Map: map 排序】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/625/detail/9661
map 排序
目录
一、基本结束
二、案例演示
一、基本介绍
1. golang 中没有一个专门的方法针对 map 的 key 进行排序。
2. golang 中的 map 默认是无序的,注意也不是按照添加的顺序存放的,每次遍历,得到的输出可能不一样。
3. golang 中 map 的排序,是先将 key 进行排序,然后根据 key 值遍历输出即可。
先来看一下 map 的排序,首先要清楚一点就是 map 在前面的讲解过程中都知道,其实 map 它这个 key 默认是无序的,而且 golang 里面并没有一个专门针对 map的 key 进行排序的方法。在其他编程语言,map 的 key 要么是有序的,要么就有专门的方法,但是 golang 里面没有,那怎么办呢?看第二点,golang 中的 map 默认是无序的,注意也不是按照添加的顺序存放的,每次遍历得到的输出可能是不一样的。
二、案例演示
举个例子来说明:新建一个文件夹叫 mapsort,在此文件夹下新建一个文件名叫main.go,在 mapslice 文件夹下的 main.go 复制了一份代码过来,代码如下:
package main
import (
“fmt”
)
func main() {
//map 的排序
map1 := mke(map[int]int, 10)
//写一个数组
map1[10] = 100
//key 是 10,值是 100
map1[1] = 13
//key 是 1,值是 13
map1[4] = 56
//key 是 4,值是 56
map1[8] = 90
//key 是 8,值是 90
fmt.Println(map1)
//输出这个 map,看一下它的顺序是什么样的
}
输出这个 map,在 cmd.exe 里输入以下命令并回车:cd chapter09,cd mapslice,cd ..,cd mapsort,go run main.go。可以看到输出的信息是这样的:
map[8:90 1:13 4:56 10:100]
并不是按照 key 的从小到大或者从大到小,而且所按照的添加顺序也不同,所以顺序的无序的。比如再输入 go run main.go 命令可以得出:
map[1:13 8:90 10:100 4:56]
而且 map 没有按照 key 排序,那么怎么办呢?注意,在第三点里,golang 中的排序,是先将 key 进行排序,然后根据 key 的值遍历输出即可。接着写:
//如何按照 map 的 key 的顺序进行排序输出
//1.先将 map 的 key 放入到切片中
//2.对切片排序
//3.遍历切片,然后按照 key 来输出 map 的值
演示:
第一步先定义一个切片,代码如下:
var keys = [ ]int
for k, v :range map1 {
//遍历 map,把 key 取出来,for range 一下对 map1 进行遍历
keys = append(keys, k)
//遍历之后把 key 放进去
}
//遍历完之后 keys 里面就有很多 k
//排序 排序的时候有一个专门方法,有一个包叫 sort 包,方法是 Ints,这里用的是 func Ints(a []int),剔出一个切片。
func Ints(a []int)
,Ints 函数将 a 排序为递增顺序。
排序的方法有很多,这里用的是递增的方法,代码如下:
sort.Intskeys()
//把 keys 放进去
fmt.Println(keys)
//输出这个 k,发现报错,是因为没有引入 sort 这个包,所以要在代码中添加 sort 包。代码如下:
package main
import (
“fmt”
“sort”
)
在 cmd.exe 里输入 go run main.go 回车,得出:
map[1:13 8:90 10:100 4: 56]
[1 4 8 10]
这时可以看到是以递增的顺序,也就是 keys 是按照 1、4、8、10 进行排列的。
第三步遍历切片:
for _, k := range keys{
//取的主要是值,值就是 k,对 k 进行 for range。所以第一个是下标,第二个是值,输出就可以了
fmt.Printf(“map1[%v]=%v \n”, k, map1[k])
//可以按照 key 输出 map 值了
//格式化之后 map1,第一个是值,map1 的 k 就把值取了,每取一次值给一个换行
} //此时此刻就可以遍历,按照 k 的顺序来输出 map,这时候顺序就有了
验证:
打开 cmd.exe,输入命令 go run main.go
回车,可以看到是稳定的:
map[8:90 10:100 1:13 4:56]
[1 4 8 10]
map1[1]=13
//第 1 个 mapkey 为 1
map1[4]=56
//第2 个 mapkey 为 4
map1[8]=90
//第3 个 mapkey 为 8
map1[10]=100
//第4 个 mapkey 为 10
再输入命令 go run main.go
运行一次,将会看见顺序是固定的:
map[10:100 1:13 4:56 8:90]
[1 4 8 10]
map1[1]=13
map1[4]=56
map1[8]=90
map1[10]=100
按照 key 的递增顺序来输出 map 的,这就是 map 的一个排序。也就是说如果同学们将来在做开发的时候,有一个业务需求比如是要按照价格的高低或者按照学生的编号来输出学生信息,那么就要按照老师的这种写法:先把它的 k 进行一个遍历放在切片里面,然后遍历这个切片,把k取出来,再输出对应的 map 值;这样就是按照 key 的顺序来显示对应的值。