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

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:由于它必須首先按時間戳排序,然后按隨機數排序,因此必須考慮隨機數的唯一情況是時間戳相等時(否則它們已經定義了要比較的元素的順序)。
- 2 回答
- 0 關注
- 170 瀏覽
添加回答
舉報