首页 > 解决方案 > 按数字和字母顺序对基于结构的切片进行排序

问题描述

我有一片这样的结构

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",
    },
}

我的问题是如何按numberand对其进行排序coordinate

我尝试过使用以下排序方法,但这并不符合我的预期

// 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

非常感谢任何帮助

标签: sortinggo

解决方案


您的比较器函数不会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
})

推荐阅读