登录
首页 >  Golang >  Go问答

对 map[float64] 按 float64 值进行排序方法

来源:stackoverflow

时间:2024-02-25 14:36:24 114浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《对 map[float64] 按 float64 值进行排序方法》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

我正在努力理解如何简单地对 map[string]float64 进行排序。我查看了如何按其值对 map[string]int 进行排序? ,它建议使用结构来进行排序,但我不确定当 sort.sort 函数需要 func(i, j int) 而不是 func(i, j float64)

例如,如何排序?

data := make(map[string]float64)
data["red"] = 1.00
data["green"] = 3.00
data["blue"] = 2.00

我尝试了以下操作,但仅按地图中的 string 排序,而不是实际的 float64

data := make(map[string]float64)
data["red"] = 1.00
data["green"] = 3.00
data["blue"] = 2.00

var keys []string
var values []float64
for 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])
}

解决方案


它需要 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]
}

感谢 marc 指出我的错误,这是我成功排序的方法:

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

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《对 map[float64] 按 float64 值进行排序方法》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>