我的 golang stldib 排序出了什么问题?
知识点掌握了,还需要不断练习才能熟练运用。下面编程网给大家带来一个Golang开发实战,手把手教大家学习《我的 golang stldib 排序出了什么问题?》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!
问题内容我正在尝试按结构体的一个字段对(golang)结构体切片进行排序。
我看过很多例子、演示和文档,我觉得我明白了,但我仍然无法让我的代码正常工作。
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 升序排序,然后反向排序。
解决方案
这里有错别字
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
)。第二个正确使用了 i
和 j
。
本篇关于《我的 golang stldib 排序出了什么问题?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注编程网公众号!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341