【问题标题】:Ignore nil elements when sorting排序时忽略 nil 元素
【发布时间】: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 &lt;nil&gt; &lt;nil&gt;] 如何正确实现?

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

【问题讨论】:

  • size:2 of d 大于 size:0 of ac。所以你在排序后得到b,a,c,d
  • 如果你总是想要 nil 最后,那么你必须总是将它们比那些不是 nil 的更大。

标签: sorting go slice


【解决方案1】:

Less 中,您不想比较sizes,除非两者 timeEnds 都是nil,然后您需要处理“只有一个@ 987654325@ 是 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)
    }
}

【讨论】:

    猜你喜欢
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 2011-06-29
    • 2023-03-21
    • 2022-07-31
    相关资源
    最近更新 更多