我遇到了一種情況,我想首先按值對地圖進行排序,如果值相等,則按 GO 中的鍵排序。這是輸入和預期輸出的示例。
import "fmt"
func main() {
wordFrequency := map[string]int{"banana": 3, "america": 2, "abb": 2, "test": 2, "car": 1}
fmt.Printf("%v", wordFrequency)
}
預期輸出:{"banana": 3,"abb": 2, "america": 2, "test": 2, "car": 1}
這里首先是香蕉,因為它的值是3。abb和america 的值都是 2,但abb是按升序排列的。所以我的問題是如何實作這種行為,我們首先按值對 map 中的條目進行排序,如果值等于我們按鍵對它們進行排序。我檢查了相關檔案和以前的問題,但沒有一個直接解決這種情況。如果由于 Go 中的 map 資料結構而無法做到,我們如何用其他結構有效地做到這一點?
在 Python 3 中,我們可以通過以下方式做到這一點
>>> d = {'apple':2, 'banana':3, 'almond':2, 'beetroot':3, 'peach':4}
>>> [k for k, v in sorted(d.iteritems(), key=lambda(k, v): (-v, k))]
['peach', 'banana', 'beetroot', 'almond', 'apple']
這是 Python鏈接的等效問題的鏈接
注意:這個問題詢問如何按值對地圖進行排序。我的問題特定于按值排序,然后按鍵排序(如果值相等)。
uj5u.com熱心網友回復:
你不能對map.
- 將 轉換
map為鍵值對結構的切片。 - 對切??片進行排序(另請參閱如何使用多個排序引數對結構進行排序?)
例如像這樣:
func main() {
wordFrequency := map[string]int{"banana": 3, "america": 2, "abb": 2, "test": 2, "car": 1}
vec := mapToSlice(wordFrequency)
sort.Slice(vec, func(i, j int) bool {
// 1. value is different - sort by value (in reverse order)
if vec[i].value != vec[j].value {
return vec[i].value > vec[j].value
}
// 2. only when value is the same - sort by key
return vec[i].key < vec[j].key
})
fmt.Printf("%v", vec)
}
func mapToSlice(in map[string]int) []KV {
vec := make([]KV, len(in))
i := 0
for k, v := range in {
vec[i].key = k
vec[i].value = v
i
}
return vec
}
type KV struct {
key string
value int
}
印刷:
[{banana 3} {abb 2} {america 2} {test 2} {car 1}]
現場演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/369725.html
