我的golang stldib排序有什么问题?

时间:2018-12-29 04:03:22

标签: sorting go

我正在尝试按其字段之一对(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

几乎是重复的工作https://play.golang.org/p/vActL0VwK3L(来自另一个SO用户)

我的应该按RMSE排序,但它根本不会改变顺序。现在,我进入游乐场的结果应该是按RMSE升序对其进行排序,然后反向进行排序。

1 个答案:

答案 0 :(得分:4)

这里有错字

func (s ByError) Less(i, j int) bool {
    return s[i].MethodRMSE < s[i].MethodRMSE
}

应该是

func (s ByError) Less(i, j int) bool {
    return s[i].MethodRMSE < s[j].MethodRMSE
}

由于很难看到,第一个(错误的)版本将项目与其自身进行了比较(两个索引均为i)。第二个同时使用ij