【问题标题】:How to sort map by value and if value equals then by key in Go?如何按值对地图进行排序,如果值等于则在Go中按键排序?
【发布时间】:2022-01-06 02:04:31
【问题描述】:

我遇到了一种情况,我想先按值对地图进行排序,如果值相等,然后在 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 中的 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 link 的等效问题的链接

N.B:这个question 询问如何按值对地图进行排序。我的问题是特定于按值排序,然后按键(如果值等于)。

【问题讨论】:

    标签: sorting dictionary go


    【解决方案1】:

    您无法对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

    【讨论】:

      猜你喜欢
      • 2019-03-10
      • 2023-03-17
      • 2021-11-10
      • 2021-10-12
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      相关资源
      最近更新 更多