为了账号安全,请及时绑定邮箱和手机立即绑定

如何按两个值对地图进行排序?

如何按两个值对地图进行排序?

Go
千万里不及你 2023-07-04 17:29:20
我正在尝试按地图的两个值对地图进行排序。首先是时间戳,然后是随机数。换句话说,我需要能够迭代并首先打印具有最小时间戳的映射,然后是随机数值。像这样:    "tx1": Transaction{Value:10, Nonce:1, Timestamp:1563543005},    "tx2": Transaction{Value:20, Nonce:2, Timestamp:1563543005},    "tx6": Transaction{Value:60, Nonce:2, Timestamp:1563543005},    "tx5": Transaction{Value:50, Nonce:4, Timestamp:1563543005},    "tx7": Transaction{Value:70, Nonce:1, Timestamp:1563543006},    "tx3": Transaction{Value:30, Nonce:3, Timestamp:1563543006},    "tx4": Transaction{Value:40, Nonce:4, Timestamp:1563543006},这是我的代码:https://play.golang.org/p/hXo5clCrlU1package mainimport (    "fmt"    "sort")type Transaction struct {    Value         uint64                        `json:"value"`    Nonce         uint64                        `json:"nonce"`    Timestamp     int64                         `json:"timestamp"`}func main() {    // To create a map as input    memPool := map[string]Transaction {        "tx1": Transaction{Value:10, Nonce:1, Timestamp:1563543005},        "tx2": Transaction{Value:20, Nonce:2, Timestamp:1563543005},        "tx3": Transaction{Value:30, Nonce:3, Timestamp:1563543006},        "tx4": Transaction{Value:40, Nonce:4, Timestamp:1563543006},        "tx5": Transaction{Value:50, Nonce:4, Timestamp:1563543005},        "tx6": Transaction{Value:60, Nonce:2, Timestamp:1563543005},        "tx7": Transaction{Value:70, Nonce:1, Timestamp:1563543006},    }    keys := make([]string, 0, len(memPool))        for key := range memPool {            keys = append(keys, key)        }        sort.Slice(keys, func(i, j int) bool { return memPool[keys[i]].Timestamp > memPool[keys[j]].Timestamp })    for _, v := range keys {        fmt.Println(v)    }    fmt.Println("")    keys2 := make([]string, 0, len(memPool))        for key2 := range memPool {            keys2 = append(keys2, key2)        }    sort.Slice(keys2, func(i, j int) bool { return memPool[keys2[i]].Nonce > memPool[keys2[j]].Nonce })    for _, v := range keys2 {        fmt.Println(v)    }}
查看完整描述

2 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

当您似乎想要排序一次时,您正在分别排序两次。因此,使用您想要用于对值进行排序的所有逻辑进行一次排序。


sort.Slice(keys, func(i, j int) bool {

    if memPool[keys[i]].Timestamp == memPool[keys[j]].Timestamp {

        if memPool[keys[i]].Nonce == memPool[keys[j]].Nonce {

            return memPool[keys[i]].Value < memPool[keys[j]].Value

        }

        return memPool[keys[i]].Nonce < memPool[keys[j]].Nonce

    }

    return memPool[keys[i]].Timestamp < memPool[keys[j]].Timestamp

})

工作示例: https: //play.golang.org/p/GERCSchEtOf


查看完整回答
反对 回复 2023-07-04
?
智慧大石

TA贡献1946条经验 获得超3个赞

立即比较两个搜索条件:


package main


import (

    "fmt"

    "sort"

)


type Transaction struct {

    Value         uint64                        `json:"value"`

    Nonce         uint64                        `json:"nonce"`

    Timestamp     int64                         `json:"timestamp"`

}


func main() {

    // To create a map as input

    memPool := map[string]Transaction {

        "tx1": Transaction{Value:10, Nonce:1, Timestamp:1563543005},

        "tx2": Transaction{Value:20, Nonce:2, Timestamp:1563543005},

        "tx3": Transaction{Value:30, Nonce:3, Timestamp:1563543006},

        "tx4": Transaction{Value:40, Nonce:4, Timestamp:1563543006},

        "tx5": Transaction{Value:50, Nonce:4, Timestamp:1563543005},

        "tx6": Transaction{Value:60, Nonce:2, Timestamp:1563543005},

        "tx7": Transaction{Value:70, Nonce:1, Timestamp:1563543006},

    }


    keys := make([]string, 0, len(memPool))

    for key := range memPool {

        keys = append(keys, key)

    }


    sort.Slice(keys, func(i, j int) bool {

        ti, tj := memPool[keys[i]], memPool[keys[j]]

        if ti.Timestamp == tj.Timestamp {

            return ti.Nonce < tj.Nonce

        }

        return ti.Timestamp < tj.Timestamp

    })


    for _, key := range keys {

        fmt.Println(memPool[key])

    }

}

https://play.golang.org/p/oFDG9Fti2JV


输出:


{10 1 1563543005}

{60 2 1563543005}

{20 2 1563543005}

{50 4 1563543005}

{70 1 1563543006}

{30 3 1563543006}

{40 4 1563543006}

less func(i, j int) bool观察参数 to的实现方式sort.Slice:由于它必须首先按时间戳排序,然后按随机数排序,因此必须考虑随机数的唯一情况是时间戳相等时(否则它们已经定义了要比较的元素的顺序)。


查看完整回答
反对 回复 2023-07-04
  • 2 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信