为了排序这样的结构我实现了三种方法:
type Event struct {
timeEnd interface{}
size float64
}
func (s ByTime) Len() int {
return len(s)
}
func (s ByTime) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
Run Code Online (Sandbox Code Playgroud)
有时并非所有Events.timeEnd都被初始化,我想将这些Events放入切片的背面并按size字段对它们进行排序.
func (s ByTime) Less(i, j int) bool {
if s[i].timeEnd == nil || s[j].timeEnd == nil{
return s[i].size < s[j].size
}else {
return s[i].timeEnd.(float64) < s[j].timeEnd.(float64)
}
}
a, b, c, d := Event{timeEnd:12.}, Event{timeEnd:nil, size:-10}, Event{timeEnd:56.}, Event{timeEnd:nil, size:2}
queue := []*Event{}
queue = append(queue, &a, &b, &c, &d)
Run Code Online (Sandbox Code Playgroud)
但结果我有:
[<nil> 12 56 <nil>]
Run Code Online (Sandbox Code Playgroud)
期待[12 56 <nil> <nil>]
如何正确实现它?
在Less,你不想比较size除非她既 timeEnd s为nil,然后你需要处理"只有一个timeEnd是nil分开"的情况.所以你有四个案例要考虑不是两个:
func (s ByTime) Less(i, j int) bool {
if s[i].timeEnd == nil && s[j].timeEnd == nil{
return s[i].size < s[j].size
} else if s[i].timeEnd == nil {
return false
} else if s[j].timeEnd == nil {
return true
} else {
return s[i].timeEnd.(float64) < s[j].timeEnd.(float64)
}
}
Run Code Online (Sandbox Code Playgroud)