gpt4 book ai didi

sorting - 排序时忽略 nil 元素

转载 作者:IT王子 更新时间:2023-10-29 01:52:10 25 4
gpt4 key购买 nike

为了对这样的结构进行排序,我实现了三种方法:

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已经初始化,我想把这样的 Event s 到 slice 的后面并按 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>]如何正确实现?

这里的例子在https://play.golang.org/p/FWU98npGtbU

最佳答案

Less 中,您不想比较 size,除非 both timeEndnil 然后你需要单独处理“只有一个 timeEndnil”的情况。所以你有四种情况要考虑,而不是两种:

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)
}
}

关于sorting - 排序时忽略 nil 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48331747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com