排序结构图 – GOLANG

我有一个结构图,我通过将数据流传输到Go程序来填充.更新地图的方式与下面的示例类似.

一旦我填充了这个结构图,那么通过结构中count字段的值对这个地图进行排序的最佳(或好)方法是什么?

package main

type data struct {
    count int64
}

func main() {
    m := make(map[string]data)
    m["x"] = data{0,0}
    if xx,ok := m["x"]; ok {
        xx.count = 2
        m["x"] = xx
    } else {
        panic("X isn't in the map")
    }
}

此示例可以在此处运行:http://play.golang.org/p/OawL6QIXuO

正如siritinga已经指出的那样,地图的元素没有排序,因此您无法对其进行排序.

您可以做的是创建切片并使用排序包对元素进行排序:

package main

import (
    "fmt"
    "sort"
)

type dataSlice []*data

type data struct {
    count int64
    size  int64
}

// Len is part of sort.Interface.
func (d dataSlice) Len() int {
    return len(d)
}

// Swap is part of sort.Interface.
func (d dataSlice) Swap(i,j int) {
    d[i],d[j] = d[j],d[i]
}

// Less is part of sort.Interface. We use count as the value to sort by
func (d dataSlice) Less(i,j int) bool {
    return d[i].count < d[j].count
}

func main() {
    m := map[string]*data {
        "x": {0,0},"y": {2,9},"z": {1,7},}

    s := make(dataSlice,len(m))

    for _,d := range m {
        s = append(s,d)
    }       

    // We just add 3 to one of our structs
    d := m["x"]
    d.count += 3

    sort.Sort(s)

    for _,d := range s {
        fmt.Printf("%+v\n",*d)
    }
}

输出

{count:1 size:7}
{count:2 size:9}
{count:3 size:0}

Playground

编辑

更新了示例以使用指针并包含一个映射,以便您可以执行查找并使用切片进行排序.

相关文章

程序目录结构 简单实现,用户登录后返回一个jwt的token,下次请求带上token请求用户信息接口并返回信息...
本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简...
简介 默克尔树(MerkleTree)是一种典型的二叉树结构,其主要特点为: 最下面的叶节点包含存储数据或其...
接下来学习并发编程, 并发编程是go语言最有特色的地方, go对并发编程是原生支持. goroutine是go中最近本...
先普及一下, 什么是广度优先搜索 广度优先搜索类似于树的层次遍历。从图中的某一顶点出发,遍历每一个顶...
第一天: 接口的定义和实现 第二天: 一. go语言是面向接口编程. 在学习继承的时候说过, go语言只有封装,...