亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何按 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 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號