在多个结构字段中按Go排序

时间:2018-06-29 23:44:19

标签: sorting go

我有一个成员数组/切片:

type SomeType struct {
    timeStamp time
    typeName string
    other variables...
}

基于typeName的结构上有3种方法,例如:

isTypeA(): returns bool
isTypeB(): returns bool
isTypeC(): returns bool

现在这是我的排序工作的方式:  -根据timeStamp升序排序  -如果timeStamp是相同的,则typeA应该在typeB之前,而typeB应该在typeC之前。 (类型A,B,C并不是真正按字母顺序排列)

我正在使用sort.Slice对timeStamp进行排序,但是我不确定如何对A,B,C类型进行排序。

2 个答案:

答案 0 :(得分:0)

将任意类型的值转换为按您的要求可以排序的 内容。

func ThingTypeSortable(thing *Thing) int {
    if thing == nil {
        return 0
    }

    if thing.isTypeA() {
        return 1
    }
    if thing.isTypeB() {
        return 2
    }
    if thing.isTypeC() {
        return 3
    }

    return 0
}

...然后,如果时间戳相等,则排序是另一回事。

sort.Slice(inputs, func(i, j int) bool {
    if inputs[i].t.UTC() != inputs[j].t.UTC() {
        return inputs[i].t.Before(inputs[j].t)
    }

    return ThingTypeSortable(inputs[i]) < ThingTypeSortable(inputs[j])
})

答案 1 :(得分:0)

使用sort.Slice通过按排序优先级顺序比较字段。

给出类型为a的变量[]SomeType,如下所示:

sort.Slice(a, func(i, j int) bool {
    if !a[i].timeStamp.Equal(a[j].timeStamp) {
        return a[i].timeStamp.Before(a[j].timeStamp)
    }
    if a[i].isTypeA() != a[j].isTypeA() {
        return a[i].isTypeA()
    }
    if a[i].isTypeB() != a[j].isTypeB() {
        return a[i].isTypeB()
    }
    return a[i].isTypeC()
})

此代码将isTypeA(),isTypeB()和isTypeC()视为单独的字段,即使它们是从相同的基础字段派生的也是如此。

我假设您打算在time.Time字段中使用类型timeStamp。该函数使用Time.Equal来正确比较time.Time的值是否相等。