如何按值对 Map\[string\]int 进行排序?

新手上路,请多包涵

鉴于此代码块

map[string]int {"hello":10, "foo":20, "bar":20}

我想打印出来

foo, 20
bar, 20
hello, 10

按照从高到低的顺序

原文由 samol 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 587
2 个回答

在 Andrew Gerrand 的 Golang-nuts 上找到了答案

可以通过编写len/less/swap函数来实现排序接口

func rankByWordCount(wordFrequencies map[string]int) PairList{
  pl := make(PairList, len(wordFrequencies))
  i := 0
  for k, v := range wordFrequencies {
    pl[i] = Pair{k, v}
    i++
  }
  sort.Sort(sort.Reverse(pl))
  return pl
}

type Pair struct {
  Key string
  Value int
}

type PairList []Pair

func (p PairList) Len() int { return len(p) }
func (p PairList) Less(i, j int) bool { return p[i].Value < p[j].Value }
func (p PairList) Swap(i, j int){ p[i], p[j] = p[j], p[i] }

对于原始帖子,请在此处找到它 https://groups.google.com/forum/#!topic/golang-nuts/FT7cjmcL7gw

原文由 samol 发布,翻译遵循 CC BY-SA 3.0 许可协议

go 1.8 中有一个新的 sort.Slice 函数,所以现在这更简单了。

 package main

import (
    "fmt"
    "sort"
)

func main() {
    m := map[string]int{
        "something": 10,
        "yo":        20,
        "blah":      20,
    }

    type kv struct {
        Key   string
        Value int
    }

    var ss []kv
    for k, v := range m {
        ss = append(ss, kv{k, v})
    }

    sort.Slice(ss, func(i, j int) bool {
        return ss[i].Value > ss[j].Value
    })

    for _, kv := range ss {
        fmt.Printf("%s, %d\n", kv.Key, kv.Value)
    }
}

https://play.golang.org/p/y1_WBENH4N

原文由 voutasaurus 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题