我有一个成员数组/切片:
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类型进行排序。
答案 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
的值是否相等。