登录
首页 >  Golang >  Go问答

sort.Slice()排序结果与预期不一致

来源:stackoverflow

时间:2024-02-07 19:24:23 264浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《sort.Slice()排序结果与预期不一致》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

func main() {
    m := []int{1, 3, 2, 1, 0, 0}
    rank := []int{0, 1, 2, 3, 4, 5}
    sort.Slice(rank, func(i, j int) bool {
        return m[i] > m[j]
    })
    fmt.Println(rank)
}

Return value:
[1 0 2 3 4 5]
Expected return value:
[1 2 0 3 4 5]

我尝试按切片 m 的降序对切片排名中的值进行排序,但结果并不符合预期。这是 go sort 包中的错误吗?


正确答案


排序失败,因为 sort.Slice 交换了 rank 的元素,但没有交换 m 的元素。 使用 sort interfaceSort 函数交换 rankm 的元素。

实现满足接口的类型:

type rankm struct{ m, rank []int }
func (s rankm) less(i, j int) bool { return s.m[i] > s.m[j] }
func (s rankm) len() int           { return len(s.m) }
func (s rankm) swap(i, j int) {
    s.m[i], s.m[j] = s.m[j], s.m[i]
    s.rank[i], s.rank[j] = s.rank[j], s.rank[i]
}

像这样排序:

m := []int{1, 3, 2, 1, 0, 0}
rank := []int{0, 1, 2, 3, 4, 5}
sort.Sort(rankm{rank: rank, m: m})

https://go.dev/play/p/mazWKPC4JRU

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

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