为了账号安全,请及时绑定邮箱和手机立即绑定

如何按值对地图进行排序,如果值等于则在Go中按键排序?

如何按值对地图进行排序,如果值等于则在Go中按键排序?

Go
茅侃侃 2022-10-17 15:46:52
我遇到了一种情况,我想先按值对地图进行排序,如果值相等,然后在 GO 中按键排序。这是输入和预期输出的示例。import "fmt"func main() {     wordFrequency := map[string]int{"banana": 3, "america": 2, "abb": 2, "test": 2, "car": 1}     fmt.Printf("%v", wordFrequency)}预期输出:{“香蕉”:3,“abb”:2,“美国”:2,“测试”:2,“汽车”:1}这里的banana是第一个,因为它的值是3。abb和america的值都是2,但是abb排在第一位,按升序排列。所以我的问题是如何实现这种行为,我们首先按值对映射中的条目进行排序,如果值等于我们按键对它们进行排序。我检查了相关文档和以前的问题,但没有一个直接解决这种情况。如果由于 Go 中的 map 数据结构而无法做到这一点,我们如何使用其他结构有效地做到这一点?在 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 链接的等效问题的链接注意:这个问题询问如何按值对地图进行排序。我的问题是特定于按值排序,然后按键(如果值等于)。
查看完整描述

1 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

您无法对map.

  1. 将 转换map为键值对结构的切片。

  2. 对切片进行排序(另请参见如何使用多个排序参数对结构进行排序?

例如像这样:

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

现场演示


查看完整回答
反对 回复 2022-10-17
  • 1 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信