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

2023-07-16  本文已影响0人  玄德公笔记

1. 按value排序

1.1 思路

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 思路

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}]


上一篇 下一篇

猜你喜欢

热点阅读