登录
首页 >  Golang >  Go问答

在Go中如何对映射按值进行排序,并在值相同时按键排序?

来源:stackoverflow

时间:2024-02-25 10:03:28 451浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《在Go中如何对映射按值进行排序,并在值相同时按键排序?》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

我遇到了一种情况,我想首先按值对地图进行排序,如果值相等,则在 go 中按键排序。这是输入和预期输出的示例。

import "fmt"

func main() {
     wordfrequency := map[string]int{"banana": 3, "america": 2, "abb": 2, "test": 2, "car": 1}
     fmt.printf("%v", wordfrequency)
}

预期输出:{"banana": 3,"abb": 2, "america": 2, "test": 2, "car": 1}

这里banana首先是因为它的值为3。abbamerica的值都是2,但是abb > 按升序排列在第一位。所以我的问题是如何实现这种行为,我们首先按值对映射中的条目进行排序,如果值相等,我们按键对它们进行排序。我已经检查了相关文档和之前的问题,但没有一个直接解决这种情况。如果由于 go 中的映射数据结构而无法做到这一点,那么我们如何使用其他结构有效地做到这一点?

在python 3中,我们可以通过以下方式做到这一点

>>> d = {'apple':2, 'banana':3, 'almond':2, 'beetroot':3, 'peach':4}
>>> [k for k, v in sorted(d.iteritems(), key=lambda(k, v): (-v, k))]
['peach', 'banana', 'beetroot', 'almond', 'apple']

这里是 python 链接的等效问题的链接

注意:这个问题询问如何按值对地图进行排序。我的问题特定于按值排序,然后按键排序(如果值相等)。


正确答案


您无法对 map 进行排序。

  1. map 转换为键值对结构体切片。
  2. 对切片进行排序(另请参阅 How to sort struct with multiple sort parameters?

例如这样:

func main() {
    wordfrequency := map[string]int{"banana": 3, "america": 2, "abb": 2, "test": 2, "car": 1}

    vec := maptoslice(wordfrequency)

    sort.slice(vec, func(i, j int) bool {
        // 1. value is different - sort by value (in reverse order)
        if vec[i].value != vec[j].value {
            return vec[i].value > vec[j].value
        }
        // 2. only when value is the same - sort by key
        return vec[i].key < vec[j].key
    })

    fmt.printf("%v", vec)
}

func maptoslice(in map[string]int) []kv {
    vec := make([]kv, len(in))
    i := 0
    for k, v := range in {
        vec[i].key = k
        vec[i].value = v
        i++
    }
    return vec
}

type kv struct {
    key   string
    value int
}

打印:

[{banana 3} {abb 2} {america 2} {test 2} {car 1}]

Live demo

本篇关于《在Go中如何对映射按值进行排序,并在值相同时按键排序?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>