登录
首页 >  Golang >  Go问答

按数字和字母顺序对基于结构的切片进行排序

来源:stackoverflow

时间:2024-04-19 18:33:32 159浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《按数字和字母顺序对基于结构的切片进行排序》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

我有一个像这样的结构切片和这个数据

type interval struct{
    number     float64
    coordinate string
}

func getintervals() []interval {

    data := []interval{
        {number: 1, coordinate: "x"},
        {number: 8, coordinate: "y"},
        {number: 2, coordinate: "x"},
        {number: 5, coordinate: "y"},
        {number: 5, coordinate: "x"},
        {number: 6, coordinate: "y"},
        {number: 3, coordinate: "x"},
        {number: 7, coordinate: "y"},
    }
    return data
}

我的问题是如何按 numbercoordinate[]interval 进行排序?

我尝试过以下排序方法,但它并不符合我的期望

data := getintervals()
// sort method that i use
sort.slice(data, func(i, j int) bool {
    return data[i].number < data[j].number
})
[{1 x} {2 x} {3 x} {5 y} {5 x} {6 y} {7 y} {8 y}] // result
[{1 x} {2 x} {3 x} {5 x} {5 y} {6 y} {7 y} {8 y}] // expectation

差异: {5 y} {5 x} 应该是 {5 x} {5 y}

我的预期结果与python的函数sort类似 我感谢任何帮助

演示


解决方案


在属性 number 相等的情况下,您的比较器函数不会比较属性 coordinate。因此,如果排序算法不稳定,{5, x} 和 {5, y} 的位置可能是不确定的。

这是比较器函数的更新版本:

sort.Slice(data, func(i, j int) bool {
    if data[i].number != data[j].number {
        return data[i].number < data[j].number
    }
    return data[i].coordinate < data[j].coordinate
})

参见Demo with both sort functions

好了,本文到此结束,带大家了解了《按数字和字母顺序对基于结构的切片进行排序》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

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