【发布时间】:2018-06-28 03:25:18
【问题描述】:
为了对这样的结构进行排序,我实现了三种方法:
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]
}
有时并非所有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)
但结果我有:
[<nil> 12 56 <nil>]
虽然期待[12 56 <nil> <nil>]
如何正确实现?
【问题讨论】:
-
size:2 of
d大于 size:0 ofa和c。所以你在排序后得到b,a,c,d。 -
如果你总是想要 nil 最后,那么你必须总是将它们比那些不是 nil 的更大。