golang 如何返回一个有序的map类型的数据

golang的map我们知道是无序的, 可是实际应用的时候, 我回经常需要返回一个有序的格式
比如list列表按时间分组排序, 这种的实现思路 应该如何呢

阅读 19.2k
6 个回答

两种场景:
1.自己程序内的话尽量是按照结构体子段排序,走sort接口自定义结构体排序规则就可以了。
2.如果是由于业务,和其他模块交互场景必须对map排序返回有序的json字符串,可以考虑从序列化入手,想省事的话可以直接用第三方库github.com/iancoleman/orderedmap

gosort包提供了接口

type Interface interface {
        // Len is the number of elements in the collection.
        Len() int
        // Less reports whether the element with
        // index i should sort before the element with index j.
        Less(i, j int) bool
        // Swap swaps the elements with indexes i and j.
        Swap(i, j int)
}

按照需要的排序规则实现其中的方法就好了。
比如你题目说的需要按照时间的先后顺序来排序,那么 Less方法的实现,就是用对象的 Time字段来比较大小。

如下是一个Demo,按照人的年龄来排序。

package main

import (
    "fmt"
    "sort"
)

// Person struct
type Person struct {
    Name string
    Age  int 
}

// Persons a set of person
type Persons []Person

// Len return count
func (p Persons) Len() int {
    return len(p)
}

// Less return bigger true
func (p Persons) Less(i, j int) bool {
    return p[i].Age < p[j].Age                                                                                                                                                           
}

// Swap swap items
func (p Persons) Swap(i, j int) {
    p[i], p[j] = p[j], p[i]
}

func main() {
    ps := Persons{}
    ps = append(ps, Person{
        "张三", 31, 
    })  
    ps = append(ps, Person{
        "李四", 23, 
    })  
    ps = append(ps, Person{
        "王五", 40, 
    })  

    sort.Sort(ps)
    fmt.Println(ps)
}

参考java treemap, map 的节点包含一个指针, 将所有元素有序串起来

使用数组或链表来记录map的顺序,遍历的时候根据数组或链表来遍历。

map 和 list一起,缺点就是要额外的申请空间,具体问题具体对待吧

结合 @andy_spf @__陈亚荣 的回答做个conclusion吧
1.如果按照map的key排序:key入slice,然后排序slice(sort包),然后map借助排序后的slice按序输出
参照: 链接描述

2.如果按照val的排序,且val本身是复杂的数据结构,例如struct,那么思路是:将kv构建为struct,然后实现struct的sort(实现sort包的接口),并遍历struct输出

3.@andy_spf 大佬总结的很到位,那个github的项目可以直接哪来用(理解代码思路后)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏