網(wǎng)站首頁 編程語言 正文
Golang中的 map 默認(rèn)是 無序的 。
起因
最近項(xiàng)目中有這樣一個需求:
根據(jù)用戶當(dāng)前的坐標(biāo)點(diǎn),獲取該用戶附近的預(yù)設(shè)城市名稱。
這里有一個注意點(diǎn)是,假設(shè)這些支持的城市名稱是預(yù)設(shè)的,所以就不能直接通過地圖類api根據(jù)坐標(biāo)點(diǎn)獲取所在城市名稱了。
想到的解決思路是:
- 獲取這幾個預(yù)設(shè)城市的坐標(biāo)點(diǎn)
- App端獲取用戶當(dāng)前坐標(biāo)點(diǎn)
- 分別計(jì)算得到該用戶坐標(biāo)點(diǎn)距離各個預(yù)設(shè)城市的坐標(biāo)點(diǎn)距離
- 然后計(jì)算得到其中距離最小的一項(xiàng)
- 這個坐標(biāo)點(diǎn)對應(yīng)的城市就是所求
探索
經(jīng)過前期計(jì)算,在上面的第 3 步操作后我得到了下面的結(jié)果:
result := map[string]float64{ ?
? ?"城市A": 2334.20, ?
?"城市B": 1992.33, ?
?"城市C": 500.26, ?
?"城市D": 10.39, ?
?"城市E": 333.33, ?
}
我們知道,Golang中 Map 是 無序的 。所以當(dāng)我們使用 for-range 循環(huán)時:
for k, v := range result { fmt.Printf("key: %v value: %v \n", k, v) }
結(jié)果可能是:
// 第一種可能結(jié)果:
key: 城市B value: 1992.33?
key: 城市C value: 500.26?
key: 城市D value: 10.39?
key: 城市E value: 333.33?
key: 城市A value: 2334.2?// 第二種可能結(jié)果:
key: 城市E value: 333.33?
key: 城市A value: 2334.2?
key: 城市B value: 1992.33?
key: 城市C value: 500.26?
key: 城市D value: 10.39?// 第三種可能結(jié)果:
key: 城市E value: 333.33?
key: 城市A value: 2334.2?
key: 城市B value: 1992.33?
key: 城市C value: 500.26?
key: 城市D value: 10.39
所以,我們不能按照 key 或者 value 來進(jìn)行排序。
實(shí)現(xiàn)
但Golang中切片 Slice 是 有序的。 我們可以結(jié)果使用 Slice 來實(shí)現(xiàn)對 Map 的排序。
第一步
我們先將上面的 map 轉(zhuǎn)換成一個 slice :
type KVPair struct { Key string Val float64 } tmpList := make([]KVPair, 0) for k, v := range result { tmpList = append(tmpList, KVPair{Key: k, Val: v}) }
上面創(chuàng)建了一個 結(jié)構(gòu)體切片 ,然后將 map 的值添加到切片中。
第二步
在 go1.8 之后,引入了 sort.Slice() 方法,可以實(shí)現(xiàn)對 slice 進(jìn)行排序,我們只需要傳入一個比較函數(shù)即可:
sort.Slice(tmpList, func(i, j int) bool { return tmpList[i].Val < tmpList[j].Val // 升序 })
第三步
然后,我們對排序后的 slice 進(jìn)行 for-range 遍歷:
for _, pair := range tmpList { ? ? ?fmt.Printf("key: %v value: %v \n", pair.Key, pair.Val) ? } // 結(jié)果: key: 城市D value: 10.39? key: 城市E value: 333.33? key: 城市C value: 500.26? key: 城市B value: 1992.33? key: 城市A value: 2334.2
可以看到,排序后的 slice 第一項(xiàng)就是我們想要的結(jié)果。
如果我們想要獲取其中 value 值最大的一項(xiàng),只需要更改 sort.Slice 中的比較方法接口:
sort.Slice(tmpList, func(i, j int) bool { return tmpList[i].Val > tmpList[j].Val // 降序 //return tmpList[i].Val < tmpList[j].Val // 升序})
總結(jié)
上面測試的完整代碼如下:
package main ? ?? import ( ? ? ?"fmt" ? ?"sort") ? ?? var result = map[string]float64{ ? ? ?"城市A": 2334.20, ? ?"城市B": 1992.33, ? ?"城市C": 500.26, ? ?"城市D": 10.39, ? ?"城市E": 333.33, ? } func main() { ? ?type KVPair struct { ? ? ? ? Key string ? ?? ? ?Val float64 ? ? ?} ? ?? ? ?tmpList := make([]KVPair, 0) ? ?? ? ?for k, v := range result { ? ? ? ? tmpList = append(tmpList, KVPair{Key: k, Val: v}) ? ? ?} ? ?? ? ?sort.Slice(tmpList, func(i, j int) bool { ? ? ? ? //return tmpList[i].Val > tmpList[j].Val // 降序 ? ? ? ? return tmpList[i].Val < tmpList[j].Val // 升序? ? ?}) ? ?? ? ?for _, pair := range tmpList { ? ? ? ? fmt.Printf("key: %v value: %v \n", pair.Key, pair.Val) ? ? ?} ? }
總結(jié)
原文鏈接:http://www.itfanr.cc/2022/03/09/golang-map-sorted-by-value/?
相關(guān)推薦
- 2022-09-07 Go編寫定時器與定時任務(wù)詳解(附第三方庫gocron用法)_Golang
- 2023-12-12 TCP通信的實(shí)現(xiàn)-優(yōu)化點(diǎn)對點(diǎn)聊天
- 2023-12-18 IllegalArgumentException異常產(chǎn)生原因及解決方案
- 2023-01-09 Pyscript使用本地Pyodide配置步驟_python
- 2021-12-11 Linux環(huán)境下查看日志文件命令詳解_Linux
- 2023-02-18 減少react組件不必要的重新渲染實(shí)現(xiàn)方法_React
- 2023-03-17 Python中threading.Timer()定時器實(shí)現(xiàn)定時任務(wù)_python
- 2022-03-14 Springboot讀取外部配置文件,項(xiàng)目部署時配置讀取不到問題
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支