sorting - 按数字和字母顺序对基于结构的 slice 进行排序

标签 sorting go

我有一个这样的结构

type Interval struct{
    number     float64
    coordinate string
}

var data []Interval

假设数据如下
[]Interval{
    Interval{
        number: 1,
        coordinate: "x",
    },
    Interval{
        number: 8,
        coordinate: "y",
    },
    Interval{
        number: 2,
        coordinate: "x",
    },
    Interval{
        number: 5,
        coordinate: "y",
    },
    Interval{
        number: 5,
        coordinate: "x",
    },
    Interval{
        number: 6,
        coordinate: "y",
    },
    Interval{
        number: 3,
        coordinate: "x",
    },
    Interval{
        number: 7,
        coordinate: "y",
    },
}

我的问题是如何按numbercoordinate排序?

我已经尝试使用下面的排序方法,但这不是我的期望
// 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}]

期待:
[{1 x} {2 x} {3 x} {5 x} {5 y} {6 y} {7 y} {8 y}]

差异:{5 y} {5 x}应该是{5 x} {5 y}
提示:我的预期结果与python具有sort函数的结果相似

非常感谢任何帮助

最佳答案

在情况属性coordinate相等的情况下,您的比较器函数不比较属性number。因此,如果排序算法不稳定,则{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
})

关于sorting - 按数字和字母顺序对基于结构的 slice 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61030036/

相关文章:

python - 查找数组中小于目标的最大元素的第一次出现

go - golang中使用空白标识符导入的用例

java - 插入和删除最大堆java

python - 对字母数字二维数组进行数字排序

mysql - 重新排序 SELECT LIMIT 查询的输出

pointers - 反射(reflect) : setting a field of a pointer

go - 如何将unix时间戳转换为十六进制

go - 如何使用 Go newRequest 方法

linux - 在 vim 插入模式下从左向右移动光标时随机出现在屏幕上的字符

javascript - 单击 ExtJS 中的标题对网格中的日期列进行排序