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

如何按 float64 值对 map[string]float64 进行排序?

如何按 float64 值对 map[string]float64 进行排序?

Go
蝴蝶不菲 2022-07-11 14:30:57
我正在努力理解如何简单地对map[string]float64. 我看了一下如何按其值对 Map[string]int 进行排序?sort.Sort,这建议使用 struct 进行排序,但是当func 期望func(i, j int)而不是时,我不确定如何执行此操作func(i, j float64)。例如,这将如何排序?data := make(map[string]float64)data["red"] = 1.00data["green"] = 3.00data["blue"] = 2.00我尝试了以下方法,但仅按string地图中的排序,而不是实际排序float64:data := make(map[string]float64)data["red"] = 1.00data["green"] = 3.00data["blue"] = 2.00var keys []stringvar values []float64for key, cost := range data {    keys = append(keys, key)    costs = append(costs, cost)}sort.Strings(keys)sort.Float64s(values)for _, key := range keys {    fmt.Printf("%s %v\n", key, data[key])}
查看完整描述

2 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

它期望int而不是float64因为i, j是用于比较和交换切片中的元素的索引。我建议你应该使用一个新的结构并为它实现 sort.Interface:


type MapData struct {

    Key   string

    Value float64

}


type MapSort []*MapData


func (m MapSort) Len() int {

    return len(m)

}

func (m MapSort) Less(i, j int) bool {

    return m[i].Value < m[j].Value

}

func (m MapSort) Swap(i, j int) {

    m[i], m[j] = m[j], m[i]

}


查看完整回答
反对 回复 2022-07-11
?
萧十郎

TA贡献1815条经验 获得超13个赞

这是我用来成功排序的内容:


package main


import (

    "fmt"

    "math"

    "sort"

)


// round a float64 to 2 decimal places.

func round(n float64) float64 {

    return math.Round(n*100) / 100

}


type Pair struct {

    Key   string

    Value float64

}


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


func main() {

    data := make(map[string]float64)

    data["red"] = 1.00

    data["green"] = 3.00

    data["blue"] = 2.00


    var i int

    sorted := make(PairList, len(data))

    for key, value := range data {

        sorted[i] = Pair{key, value}

        i++

    }

    sort.Sort(sort.Reverse(sorted))

    for _, pair := range sorted {

        fmt.Printf("%s %v\n", pair.Key, round(pair.Value))

    }

}


查看完整回答
反对 回复 2022-07-11
  • 2 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

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