第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang Sort 為 map 添加額外的值

Golang Sort 為 map 添加額外的值

Go
ITMISS 2021-11-22 15:41:25
type GeoNameTally struct {    Id    uint32    Count uint32}type Tally map[uint32]GeoNameTally以上是我擁有的結構。這個想法很簡單。我只是在計算某事發(fā)生了多少次。func (t Tally) Len() int           { return len(t) }func (t Tally) Less(i, j int) bool { return t[uint32(i)].Count < t[uint32(j)].Count }func (t Tally) Swap(i, j int)      { t[uint32(i)], t[uint32(j)] = t[uint32(j)], t[uint32(i)] }一切正常,直到我開始排序。在排序之前,地圖看起來不錯:map[1043487:{Id:1043487 Count:1} 1043503:{Id:1043503 Count:1} 1043444:{Id:1043444 Count:1} 1043491:{Id:1043491 Count:1} 1043459:{Id:1043459 Count:1} 1043475:{Id:1043475 Count:1} 1043464:{Id:1043464 Count:1} 1043441:{Id:1043441 Count:1} 1043470:{Id:1043470 Count:1} 1043460:{Id:1043460 Count:1}]但是,sort.Sort(myTally)在地圖具有額外值和空值之后,您可以從以下輸出中看到:map[1043503:{Id:1043503 Count:1} 1043491:{Id:1043491 Count:1} 1043459:{Id:1043459 Count:1} 1043475:{Id:1043475 Count:1} 4:{Id:0 Count:0} 8:{Id:0 Count:0} 1043487:{Id:1043487 Count:1} 1:{Id:0 Count:0} 5:{Id:0 Count:0} 9:{Id:0 Count:0} 1043470:{Id:1043470 Count:1} 2:{Id:0 Count:0} 6:{Id:0 Count:0} 1043444:{Id:1043444 Count:1} 1043441:{Id:1043441 Count:1} 1043460:{Id:1043460 Count:1} 3:{Id:0 Count:0} 7:{Id:0 Count:0} 1043464:{Id:1043464 Count:1}]我對這三個功能做錯了嗎?
查看完整描述

2 回答

?
波斯汪

TA貢獻1811條經驗 獲得超4個贊

您將不存在的索引傳遞給Swap(i, j).


地圖類型是復合的。它是根據另外兩種類型定義的:鍵類型和值類型。例子:


map[string]bool

在前面的例子中,string是鍵類型,bool是值類型。


您可能知道,地圖訪問返回 1 或 2 個值。在像您這樣的 1 返回值上下文中,當給定不存在的索引時,地圖訪問將返回地圖值類型的零值。


這意味著如果您訪問m["im_not_defined"]某個mtype 的地圖map[string]bool,您將獲得一個返回值,該值是bool(地圖的值類型)的零值。


您可以通過執(zhí)行(在 Swap 中)來檢查索引是否定義:


if a, k := t[uint32(i)]; k {

    t[uint32(j)] = a

} else {

    panic("undefined index")

}

類似地對于j.


所以基本上,如果i未定義,則將 的零值GeoNameTally分配給t[j]并導致您的“空”(零)值。


無論如何,如果你想對任何東西進行排序,你就必須使用切片。根據定義,地圖是無序的。


查看完整回答
反對 回復 2021-11-22
?
慕后森

TA貢獻1802條經驗 獲得超5個贊

從 Go 1.8 開始,有一種更簡單的方法可以對切片進行排序,而無需您定義新類型。您只需創(chuàng)建一個 Less(匿名)lambda。


a := []int{5, 3, 4, 7, 8, 9}

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

    return a[i] < a[j]

})

for _, v := range a {

    fmt.Println(v)

}


查看完整回答
反對 回復 2021-11-22
  • 2 回答
  • 0 關注
  • 174 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號