溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Golang中Map怎么按照Value大小排序

發(fā)布時(shí)間:2022-03-09 16:03:57 來(lái)源:億速云 閱讀:642 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“Golang中Map怎么按照Value大小排序”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Golang中Map怎么按照Value大小排序”文章能幫助大家解決問(wèn)題。

起因

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

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

這里有一個(gè)注意點(diǎn)是,假設(shè)這些支持的城市名稱是預(yù)設(shè)的,所以就不能直接通過(guò)地圖類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)過(guò)前期計(jì)算,在上面的第 3 步操作后我得到了下面的結(jié)果:

result := map[string]float64{  
   "城市A": 2334.20,  
 "城市B": 1992.33,  
 "城市C": 500.26,  
 "城市D": 10.39,  
 "城市E": 333.33,  
}

我們知道,Golang中 Map 是 無(wú)序的 。所以當(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 來(lái)進(jìn)行排序。

實(shí)現(xiàn)

但Golang中切片 Slice 是 有序的。 我們可以結(jié)果使用 Slice 來(lái)實(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)  
   }  
}

關(guān)于“Golang中Map怎么按照Value大小排序”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI