go - 按值的降序遍历 Map

标签 go maps

我正在尝试按照针对键存储的值的降序遍历 map 。我试过:

func frequencySort(s string) string {
  var frequency map[string]int
  chararray := strings.Split(s , "")
  var a []int
  var arranged map[int]string
  for k , v := range frequency {
      arranged[v] = k
  }
  for k := range arranged {
      a = append(a , k)
  }
  sort.Sort(sort.Reverse(sort.IntSlice{a}))
}

假设 map 结构是:

    "a" : 9
    "b" : 7
    "c" : 19
    "d" : 11

我正在尝试遍历它,使得输出为:

"c" : 19
"d" : 11
"a" : 9
"b" : 7

最佳答案

只要您在 frequency 中有多个具有相同值的键,例如 "a":7,您在示例中使用的两种映射方法就会失效和 "b":7,那么您将丢失 arranged 中的数据,因为键必须是唯一的。

为避免这种情况,您可以创建一个辅助类型来临时保存 map 的内容,仅用于排序目的。像这样:

package main

import (
    "fmt"
    "sort"
)

var m = map[string]int{
    "a": 9,
    "b": 7,
    "c": 19,
    "d": 11,
}

type entry  struct {
    val int
    key string
}

type entries []entry

func (s entries) Len() int { return len(s) }
func (s entries) Less(i, j int) bool { return s[i].val < s[j].val }
func (s entries) Swap(i, j int) { s[i], s[j] = s[j], s[i] }

func main() {
    var es entries
    for k, v := range m {
        es = append(es, entry{val: v, key: k})
    }

    sort.Sort(sort.Reverse(es))

    for _, e := range es {
        fmt.Printf("%q : %d\n", e.key, e.val)   
    }
}

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

关于go - 按值的降序遍历 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47121635/

相关文章:

javascript - 谷歌地图 API v3 : Driving directions over a map which first loads 2 positions

c++ - 如何检测 std::map 循环中的最后一次迭代?

swift - 如何更新 Apple map 中的路线 - iOS 13.0 中的 Xcode Swift 5?

r - 将特定值与 colorkey levelplot R 中的特定颜色进行匹配

time - 使用 time.Format 时的本地化

go - 是否有推荐的方法来定义 slice 集合的常见行为?

go - Go语言中的随机整数在每个运行时都是可预测的

java - 是否有关于 SwingX-WS 1.1 及其开发状态的任何 [un] 官方信息?

logging - 具有文件记录可能性的可配置记录器

go - 如何测试 channel 是否关闭并且仅在未关闭时发送给它