【问题标题】:Sorting in Go on multiple struct fields [duplicate]在Go中对多个结构字段进行排序[重复]
【发布时间】:2018-06-30 13:22:56
【问题描述】:

我有一个成员数组/切片:

type SomeType struct {
    timeStamp time
    typeName string
    other variables...
}

并且基于typeName的这个结构有3个方法,比如:

isTypeA(): returns bool
isTypeB(): returns bool
isTypeC(): returns bool

现在这就是我的排序需要的工作方式: - 基于时间戳升序排序 - 如果时间戳相同,那么 typeA 应该在 typeB 之前,而 typeB 应该在 typeC 之前。 (类型 A、B、C 不是真正的字母)

我正在使用 sort.Slice 对 timeStamp 进行排序,但我不确定如何进行类型 A、B、C 排序。

【问题讨论】:

    标签: sorting go


    【解决方案1】:

    将任意类型值转换为 可按照您的要求进行排序的内容。

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

    【讨论】:

      【解决方案2】:

      通过按排序优先级顺序比较字段来使用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 值是否相等。

      【讨论】:

        猜你喜欢
        • 2016-09-12
        • 1970-01-01
        • 2021-11-20
        • 2015-08-10
        • 1970-01-01
        • 1970-01-01
        • 2011-06-21
        • 1970-01-01
        • 2011-05-23
        相关资源
        最近更新 更多