最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang中Map按照Value大小排序的方法實(shí)例

 更新時(shí)間:2022年03月09日 14:21:31   作者:IT范兒  
這篇文章主要給大家介紹了關(guān)于Golang中Map按照Value大小排序的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

Golang中的 map 默認(rèn)是 無序的 。

起因

最近項(xiàng)目中有這樣一個(gè)需求:

根據(jù)用戶當(dāng)前的坐標(biāo)點(diǎn),獲取該用戶附近的預(yù)設(shè)城市名稱。

這里有一個(gè)注意點(diǎn)是,假設(shè)這些支持的城市名稱是預(yù)設(shè)的,所以就不能直接通過地圖類api根據(jù)坐標(biāo)點(diǎn)獲取所在城市名稱了。

想到的解決思路是:

  1. 獲取這幾個(gè)預(yù)設(shè)城市的坐標(biāo)點(diǎn)
  2. App端獲取用戶當(dāng)前坐標(biāo)點(diǎn)
  3. 分別計(jì)算得到該用戶坐標(biāo)點(diǎn)距離各個(gè)預(yù)設(shè)城市的坐標(biāo)點(diǎn)距離
  4. 然后計(jì)算得到其中距離最小的一項(xiàng)
  5. 這個(gè)坐標(biāo)點(diǎn)對(duì)應(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)時(shí):

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)對(duì) Map 的排序。

第一步

我們先將上面的 map 轉(zhuǎn)換成一個(gè) 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)建了一個(gè) 結(jié)構(gòu)體切片 ,然后將 map 的值添加到切片中。

第二步

在 go1.8 之后,引入了 sort.Slice() 方法,可以實(shí)現(xiàn)對(duì) slice 進(jìn)行排序,我們只需要傳入一個(gè)比較函數(shù)即可:

sort.Slice(tmpList, func(i, j int) bool {  
   return tmpList[i].Val < tmpList[j].Val // 升序  
})

第三步

然后,我們對(duì)排序后的 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é)

上面測(cè)試的完整代碼如下:

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é)

到此這篇關(guān)于Golang中Map按照Value大小排序的文章就介紹到這了,更多相關(guān)Golang中Map大小排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang類型斷言的實(shí)現(xiàn)示例

    golang類型斷言的實(shí)現(xiàn)示例

    在Go語言中,類型斷言用于從接口類型獲取其具體類型的值,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • golang中beego入門

    golang中beego入門

    Beego是一個(gè)基于Go語言的開源框架,用于構(gòu)建Web應(yīng)用程序和API,本文主要介紹了golang中beego入門,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • golang端口占用檢測(cè)的使用

    golang端口占用檢測(cè)的使用

    這篇文章主要介紹了golang端口占用檢測(cè)的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Golang之defer 延遲調(diào)用操作

    Golang之defer 延遲調(diào)用操作

    這篇文章主要介紹了Golang之defer 延遲調(diào)用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 一文總結(jié)Go語言切片核心知識(shí)點(diǎn)和坑

    一文總結(jié)Go語言切片核心知識(shí)點(diǎn)和坑

    都說Go的切片用起來絲滑得很,Java中的List怎么用,切片就怎么用,作為曾經(jīng)的Java選手,因?yàn)榍衅氖褂貌坏卯?dāng),喜提缺陷若干,本文就給大家總結(jié)一下Go語言切片核心知識(shí)點(diǎn)和坑,需要的朋友可以參考下
    2023-06-06
  • Golang Gin框架實(shí)現(xiàn)多種數(shù)據(jù)格式返回結(jié)果詳解

    Golang Gin框架實(shí)現(xiàn)多種數(shù)據(jù)格式返回結(jié)果詳解

    這篇文章主要介紹了Golang Gin框架實(shí)現(xiàn)多種數(shù)據(jù)格式返回結(jié)果,我們都知道,一個(gè)完整的請(qǐng)求包含請(qǐng)求和處理請(qǐng)求以及結(jié)果返回三個(gè)步驟,在服務(wù)器端對(duì)請(qǐng)求處理完成以后,會(huì)將結(jié)果返回給客戶端,在gin框架中,支持返回多種請(qǐng)求數(shù)據(jù)格式,下面我們一起來看看
    2023-05-05
  • 淺析Go語言中閉包的使用

    淺析Go語言中閉包的使用

    閉包是一個(gè)函數(shù)和其相關(guān)的引用環(huán)境組合的一個(gè)整體。本文主要為大家介紹一下Go語言中閉包的使用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語言有一定幫助,需要的可以參考一下
    2022-12-12
  • golang image圖片處理示例

    golang image圖片處理示例

    這篇文章主要介紹了golang image圖片處理的方法,結(jié)合實(shí)例形式分析了Go語言針對(duì)圖片的打開、讀取、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下
    2016-07-07
  • 解決golang處理http response碰到的問題和需要注意的點(diǎn)

    解決golang處理http response碰到的問題和需要注意的點(diǎn)

    這篇文章主要介紹了解決golang處理http response碰到的問題和需要注意的點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go中的gRPC入門教程詳解

    Go中的gRPC入門教程詳解

    本文詳細(xì)講解了Go中的gRPC入門教程,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03

最新評(píng)論

崇信县| 当涂县| 金阳县| 邛崃市| 博兴县| 武乡县| 宁化县| 临潭县| 湄潭县| 水富县| 榆树市| 同江市| 安义县| 渑池县| 即墨市| 东山县| 松阳县| 阜城县| 方正县| 常熟市| 龙泉市| 周至县| 宽城| 江源县| 威宁| 葵青区| 新邵县| 遂溪县| 富裕县| 桦甸市| 阳江市| 浦县| 芜湖县| 新民市| 射洪县| 崇州市| 抚松县| 双牌县| 新沂市| 轮台县| 思南县|