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

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

阅读 1.2k
评论 2019-09-02 提问
    6 个回答

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

    评论 赞赏 2019-11-07

      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)
      }
      评论 赞赏 2019-09-03
        bmf
        • 168

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

        评论 赞赏 2019-09-02

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

          评论 赞赏 2019-09-02

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

            评论 赞赏 2019-09-03

              结合 @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的项目可以直接哪来用(理解代码思路后)

              评论 赞赏 2019-11-11
                撰写回答

                登录后参与交流、获取后续更新提醒