【问题标题】:How to sort by time.Time如何按时间排序。时间
【发布时间】:2022-03-23 18:33:50
【问题描述】:

我正在尝试按类型为 time.Time 的成员对 Go 中的结构进行排序。 结构如下。

type reviews_data struct {
    review_id string
    date time.Time
    score int
    firstname string
    anonymous bool
    review_text string
    title_text string
    rating float64
    upcount int
}

我有以下排序功能

type timeSlice []reviews_data

// Forward request for length
func (p timeSlice) Len() int {
    return len(p) 
}

// Define compare
func (p timeSlice) Less(i, j int) bool {
    return p[i].date.Before(p[j].date)
}

// Define swap over an array
func (p timeSlice) Swap(i, j int) {
    p[i], p[j] = p[j], p[i] 
}

地图定义如下

var reviews_data_map = make(map[string]reviews_data)

地图被值填充后,地图按值排序如下

//Sort the map by date
    date_sorted_reviews := make(timeSlice, 0, len(reviews_data_map))
    for _, d := range reviews_data_map {
        date_sorted_reviews = append(date_sorted_reviews, d)
    }       
    sort.Sort(date_sorted_reviews)

问题是结果没有排序。谁能告诉我是什么问题。

【问题讨论】:

  • 确定它们没有排序吗?您的排序代码是正确的。
  • 这是排序前的输出 2014-04-16 19:57:22.096 +0000 UTC 2014-04-15 20:08:07.226 +0000 UTC 2014-04-15 20:15:16.825 +0000 UTC 2014-04-15 20:17:28.726 +0000 UTC 排序后 2014-04-15 20:15:16.825 +0000 UTC 2014-04-15 20:08:07.226 +0000 UTC 2014-04-15 20 :17:28.726 +0000 UTC 2014-04-16 19:57:22.096 +0000 UTC
  • 您没有给我们一个简短的工作程序来说明您的问题。例如,请参阅我的答案。
  • 这是一个工作程序,只是说输出没有排序我添加了一个打印语句。这也是一个巨大程序的一部分。所以我刚刚提到了必要的部分。
  • 我无法从您的问题中复制代码并进行编译。这不是一个工作程序。有关工作程序的示例,请参阅我的答案。

标签: go


【解决方案1】:

转到 1.8 及更高版本:

sort.Slice(timeSlice, func(i, j int) bool {
    return timeSlice[i].date.Before(timeSlice[j].date)
})

【讨论】:

  • 谢谢。与接受的答案相比,使用 sort.Slice 有什么缺点吗?
【解决方案2】:

在我看来它已排序:

package main

import (
    "fmt"
    "sort"
    "time"
)

type reviews_data struct {
    review_id   string
    date        time.Time
    score       int
    firstname   string
    anonymous   bool
    review_text string
    title_text  string
    rating      float64
    upcount     int
}

type timeSlice []reviews_data

func (p timeSlice) Len() int {
    return len(p)
}

func (p timeSlice) Less(i, j int) bool {
    return p[i].date.Before(p[j].date)
}

func (p timeSlice) Swap(i, j int) {
    p[i], p[j] = p[j], p[i]
}

func main() {
    var reviews_data_map = make(map[string]reviews_data)
    reviews_data_map["1"] = reviews_data{date: time.Now().Add(12 * time.Hour)}
    reviews_data_map["2"] = reviews_data{date: time.Now()}
    reviews_data_map["3"] = reviews_data{date: time.Now().Add(24 * time.Hour)}
    //Sort the map by date
    date_sorted_reviews := make(timeSlice, 0, len(reviews_data_map))
    for _, d := range reviews_data_map {
        date_sorted_reviews = append(date_sorted_reviews, d)
    }
    fmt.Println(date_sorted_reviews)
    sort.Sort(date_sorted_reviews)
    fmt.Println(date_sorted_reviews)
}

输出:

[{ {63393534000 0 0x1ba3e0} 0  false   0 0} { {63393490800 0 0x1ba3e0} 0  false   0 0} { {63393577200 0 0x1ba3e0} 0  false   0 0}]
[{ {63393490800 0 0x1ba3e0} 0  false   0 0} { {63393534000 0 0x1ba3e0} 0  false   0 0} { {63393577200 0 0x1ba3e0} 0  false   0 0}]

【讨论】:

  • 得到了答案,打印排序后的数据时出现问题。谢谢@peterSO
  • 我需要所有这些二级数据结构来排序吗?
  • 显然,这已经过时了。
【解决方案3】:

这可以在 go 1.8 下完成,而在接受的答案中没有额外的类型和映射。

package main

import (
    "fmt"
    "time"
    "sort"
)

type reviews_data struct {
    review_id   string
    date        time.Time
}

func main() {
    fmt.Println("Sort Example")
    var listOfReviews = make([]reviews_data, 0)
    listOfReviews = append(listOfReviews, reviews_data{review_id: "1",date:time.Now()})
    listOfReviews = append(listOfReviews, reviews_data{review_id: "2",date: time.Now().AddDate(0, 0, 7*1)})
    listOfReviews = append(listOfReviews, reviews_data{review_id: "1",date: time.Now().AddDate(0, 0, 7*-1)})

    sort.Slice(listOfReviews, func(i, j int) bool { return listOfReviews[i].date.Before(listOfReviews[j].date) })
}

【讨论】:

    【解决方案4】:

    排序日期

    type Location struct {
      Lat     float64   `json:"lat"`
      Lng     float64   `json:"lng"`
      Thetime time.Time `json:"thetime"`
    }
    func sorttime(dat []Location) {
      for i := 0; i < len(dat); i++ {
        for j := i + 1; j < len(dat); j++ {
          if dat[i].Thetime.Unix() < dat[j].Thetime.Unix() {
            dat[i], dat[j] = dat[j], dat[i]
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 2011-09-20
      • 2011-02-24
      • 2014-10-03
      • 1970-01-01
      相关资源
      最近更新 更多