我的 golang stldib 排序出了什么问题?

我正在尝试按其字段之一对(Golang)结构切片进行排序。


我看了很多示例、go-playgrounds 和文档,我觉得我明白了,但我仍然无法让我的代码正常工作。


package main


import (

    "fmt"

    "sort"

)


type Method struct {

    MethodNumber int       `json:"methodNumber"`

    MethodRank   int       `json:"rank"`

    MethodRMSE   float64   `json:"error"`

    Forecast     []float64 `json:"forecast"`

}


// extra stuff for sorting.

type ByError []Method


func (s ByError) Len() int {

    return len(s)

}

func (s ByError) Swap(i, j int) {

    s[i], s[j] = s[j], s[i]

}

func (s ByError) Less(i, j int) bool {

    return s[i].MethodRMSE < s[i].MethodRMSE

}


func main() {


    xs := make([]Method, 0)

    fmt.Println(len(xs))

    xs = append(xs, Method{MethodNumber: 1, MethodRMSE: 10})

    xs = append(xs, Method{MethodNumber: 2, MethodRMSE: 8})

    xs = append(xs, Method{MethodNumber: 3, MethodRMSE: 6})

    xs = append(xs, Method{MethodNumber: 4, MethodRMSE: 4})


    fmt.Printf("%+v \n", xs)

    sort.Sort(ByError(xs))

    fmt.Printf("%+v \n", xs)

    sort.Sort(sort.Reverse(ByError(xs)))

    fmt.Printf("%+v \n", xs)



}

我的非工作代码:https://play.golang.org/p/h8SHVjTQSPM


我的应该按 RMSE 排序,但它根本不会改变顺序。现在,我的 go playground 的结果应该是按 RMSE 升序排序,然后反向排序。


慕村225694
浏览 122回答 1
1回答

海绵宝宝撒

这里打字错误func&nbsp;(s&nbsp;ByError)&nbsp;Less(i,&nbsp;j&nbsp;int)&nbsp;bool&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;s[i].MethodRMSE&nbsp;<&nbsp;s[i].MethodRMSE }应该func&nbsp;(s&nbsp;ByError)&nbsp;Less(i,&nbsp;j&nbsp;int)&nbsp;bool&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;s[i].MethodRMSE&nbsp;<&nbsp;s[j].MethodRMSE }因为它有点难看,第一个(错误的)版本将项目与自身进行比较(两个索引都是i)。第二个正确地使用了i和j。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go