Golang中如何按日期升序排序Map

Golang中如何按日期升序排序Map 如何按升序对包含日期字段的映射进行排序? 以下是生成映射的代码示例

输出:

{
  "10": {
    "charges": 110,
    "from_dates": "2009-11-30T23:00:00Z"
  },
  "20": {
    "charges": 120,
    "from_dates": "2009-11-11T23:00:00Z"
  },
  "30": {
    "charges": 130,
    "from_dates": "2009-11-17T23:00:00Z"
  }
}

我期望实现的输出:

{
  "10": {
    "charges": 120,
    "from_dates": "2009-11-11T23:00:00Z"
  },
  "20": {
    "charges": 130,
    "from_dates": "2009-11-17T23:00:00Z"
  },
  "30": {
    "charges": 110,
    "from_dates": "2009-11-30T23:00:00Z"
  }
}

我尝试使用 sort.Sort(),但出现了错误:cannot use from_dates["from_dates"] (value of type map[int]time.Time) as sort.Interface value in argument to sort.Sort: missing method Len。 如何根据日期进行排序?


更多关于Golang中如何按日期升序排序Map的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

谢谢

更多关于Golang中如何按日期升序排序Map的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


既然您要先交换再根据键值排序,那么您需要类似这样的代码:The Go Playground

你好 @ganesh_salunkhe

这篇帖子可能包含你正在寻找的解决方案。

简而言之:

  • 将映射的键读取到一个切片中
  • 对该切片进行排序
  • 使用排序后的键来读取映射的值

在Go中,map本身是无序的,无法直接排序。你需要将map的键值对提取到切片中,然后根据日期字段进行排序。以下是解决方案:

package main

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

type Record struct {
	Charges    int       `json:"charges"`
	FromDates  time.Time `json:"from_dates"`
}

func main() {
	// 原始数据
	data := map[string]Record{
		"10": {Charges: 110, FromDates: parseTime("2009-11-30T23:00:00Z")},
		"20": {Charges: 120, FromDates: parseTime("2009-11-11T23:00:00Z")},
		"30": {Charges: 130, FromDates: parseTime("2009-11-17T23:00:00Z")},
	}

	// 创建键的切片用于排序
	keys := make([]string, 0, len(data))
	for k := range data {
		keys = append(keys, k)
	}

	// 根据日期升序排序
	sort.Slice(keys, func(i, j int) bool {
		return data[keys[i]].FromDates.Before(data[keys[j]].FromDates)
	})

	// 按排序后的顺序输出
	for _, key := range keys {
		fmt.Printf("%s: %+v\n", key, data[key])
	}
}

func parseTime(s string) time.Time {
	t, _ := time.Parse(time.RFC3339, s)
	return t
}

如果你需要重新组织数据,可以创建一个新的有序map:

package main

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

type Record struct {
	Charges    int       `json:"charges"`
	FromDates  time.Time `json:"from_dates"`
}

func main() {
	data := map[string]Record{
		"10": {Charges: 110, FromDates: parseTime("2009-11-30T23:00:00Z")},
		"20": {Charges: 120, FromDates: parseTime("2009-11-11T23:00:00Z")},
		"30": {Charges: 130, FromDates: parseTime("2009-11-17T23:00:00Z")},
	}

	// 创建排序结构
	type sortable struct {
		key    string
		record Record
	}
	
	slice := make([]sortable, 0, len(data))
	for k, v := range data {
		slice = append(slice, sortable{key: k, record: v})
	}

	// 按日期升序排序
	sort.Slice(slice, func(i, j int) bool {
		return slice[i].record.FromDates.Before(slice[j].record.FromDates)
	})

	// 创建新的有序map
	sortedData := make(map[string]Record)
	for i, item := range slice {
		// 使用新的键(如"10", "20", "30")或保持原键
		newKey := fmt.Sprintf("%d", (i+1)*10)
		sortedData[newKey] = item.record
	}

	fmt.Printf("%+v\n", sortedData)
}

func parseTime(s string) time.Time {
	t, _ := time.Parse(time.RFC3339, s)
	return t
}

输出结果会按日期升序排列,最早的日期(2009-11-11)对应键"10",中间的日期对应键"20",最晚的日期对应键"30"。

回到顶部