美文网首页
GO语言基础-04-数据类型-04-map(map的排序)

GO语言基础-04-数据类型-04-map(map的排序)

作者: 玄德公笔记 | 来源:发表于2023-07-16 21:30 被阅读0次

1. 按value排序

1.1 思路

  • map本身的顺序不可控,我们考虑如下方法实现排队:
    • 思路一:通过一个切片来接收拍好队的map成员
    • 思路二:用一个切片接收map成员,给切片排队
  • 我们找到sort.Slice()方法轻松给切片排队,因此决定使用思路二

1.2 语法

  • 语法
func Slice(x any, less func(i int, j int) bool)

参数中的函数自定义一个比较的方法

  • 语法示例
    sort.Slice(mySlice, func(i, j int) bool {
        return mySlice[i].Weight < mySlice[j].Weight
    })

1.3 完整示例

package main

import (
    "fmt"
    "sort"
)

//创建一个切片准备接收map的数据
type Fruit struct {
    Name   string
    Weight int64
}

func main() {
    //实例化一个map
    fruitMap := map[string]int64{
        "banana": 7,
        "apple":  5,
        "orange": 6,
        "peach":  8,
        "lemon":  9,
    }

    //创建一个接收结构体的切片,将map的值传入切片
    var fruitList []Fruit
    for k, v := range fruitMap {
        fruitList = append(fruitList, Fruit{k, v})
    }
    fmt.Printf("排序前:%+v\n", fruitList)

    //给切片排序
    sort.Slice(fruitList, func(i, j int) bool {
        return fruitList[i].Weight < fruitList[j].Weight
    })
    fmt.Printf("排序后:%+v\n", fruitList)
}
  • 输出结果
排序前:[{Name:peach Weight:8} {Name:lemon Weight:9} {Name:banana Weight:7} {Name:apple Weight:5} {Name:orange Weight:6}]
排序后:[{Name:apple Weight:5} {Name:orange Weight:6} {Name:banana Weight:7} {Name:peach Weight:8} {Name:lemon Weight:9}]

如上可见,接收切片fruitList 排序前是乱的(因为map的顺序不可控),排序后可以按大小输出了

2. 按key排序

2.1 思路

  • 用一个切片接收map的key
  • 给切片成员排序
  • 按切片输出map成员

2.2 语法示例

func Sort(data Interface)

2.3 完整示例

  • 代码
package main

import (
    "fmt"
    "sort"
)

func main() {
    //定义一个map
    MyMap := map[int]int64{
        3: 7,
        2: 5,
        4: 6,
        7: 8,
        6: 9,
    }
    //定义一个切片组,接收map的key
    keys := []int{}
    for key := range MyMap {
        keys = append(keys, key)
    }
    //给切片排序
    sort.Sort(sort.IntSlice(keys))
   //按着切片输出map(当然你也可以用另一个切片接收)
    for _, key := range keys {
        fmt.Printf("%v : %v\n", key, MyMap[key])
    }
}
  • 输出
2 : 5
3 : 7
4 : 6
6 : 9
7 : 8

2.4 完整示例

当然,我们按着 1.3中的方法直接用切片来接收并排序也是可以的

  • 代码
package main

import (
    "fmt"
    "sort"
)

// 创建一个切片准备接收map的数据
type Fruit struct {
    Key   int
    Value int64
}

func main() {
    //实例化一个map
    fruitMap := map[int]int64{
        3: 7,
        2: 5,
        4: 6,
        7: 8,
        6: 9,
    }

    //创建一个接收结构体的切片,将map的值传入切片
    var fruitList []Fruit
    for k, v := range fruitMap {
        fruitList = append(fruitList, Fruit{k, v})
    }
    fmt.Printf("排序前:%+v\n", fruitList)

    //给切片排序
    sort.Slice(fruitList, func(i, j int) bool {
        return fruitList[i].Key < fruitList[j].Key
    })
    fmt.Printf("排序后:%+v\n", fruitList)
}
  • 输出
排序前:[{Key:3 Value:7} {Key:2 Value:5} {Key:4 Value:6} {Key:7 Value:8} {Key:6 Value:9}]
排序后:[{Key:2 Value:5} {Key:3 Value:7} {Key:4 Value:6} {Key:6 Value:9} {Key:7 Value:8}]


相关文章

  • 10.map

    Go语言基础之map | Golang Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现。 ...

  • 初识Go语言-1

    Go语言学习路径 初识Go语言 Go语言环境搭建与IDE安装 Go语言基础语法 Go语言数据类型 Go语言变量和常...

  • Go语言第3天 - 常用数据类型

    以下内容部分参考自Go语言基础数据类型Go语言中的数组切片:特立独行的可变数组Go语言数据类型-数组Go标准容器之...

  • Go语言高并发Map解决方案

    Go语言高并发Map解决方案 Go语言基础库中的map不是并发安全的,不过基于读写锁可以实现线程安全;不过在Go1...

  • 第三章:Go语言基础数据类型

    1. Go语言数据类型 1.1 数据类型分类 Go语言数据类型大致可以分为两类基础类型,其中就包括了我们最常见的一...

  • 02-Go语言常量和变量

    Go语言的数据类型 C语言的数据类型 Go语言的数据类型 Go语言各数据类型占用内存空间 Go语言中也可以使用si...

  • Go语言入门指南系列之《2基础类型》

    Go 语言中的基础类型   在 Go 编程语言中,数据类型用于声明函数和属性。数据类型的出现时为了把数据分成所需要...

  • 【Golang 基础】Go 语言中的基本类型

    Go 语言中的基础类型   在 Go 编程语言中,数据类型用于声明函数和属性。数据类型的出现时为了把数据分成所需要...

  • Go学习-数据类型

    Go数据类型 Go语言将数据类型分为四类 基础类型 复合类型 引用类型 接口类型 基础类型 数字 字符串 布尔 整...

  • Go语言探索 - 11(原创)

    Go语言基础系列博客用到的所有示例代码 上一篇文章主要学习了Go语言的切片以及Map。本篇文章主要学习的是Go语言...

网友评论

      本文标题:GO语言基础-04-数据类型-04-map(map的排序)

      本文链接:https://www.haomeiwen.com/subject/sbpwudtx.html