婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > golang對自定義類型進行排序的解決方法

golang對自定義類型進行排序的解決方法

熱門標(biāo)簽:建造者2地圖標(biāo)注 汕頭小型外呼系統(tǒng) 濱州自動電銷機器人排名 鄭州亮點科技用的什么外呼系統(tǒng) 浙江高頻外呼系統(tǒng)多少錢一個月 惠州電銷防封電話卡 阿里云ai電話機器人 釘釘有地圖標(biāo)注功能嗎 黃岡人工智能電銷機器人哪個好

前言

Go 語言支持我們自定義類型,我們大家在實際項目中,常常需要根據(jù)一個結(jié)構(gòu)體類型的某個字段進行排序。之前遇到這個問題不知道如何解決,后來在網(wǎng)上搜索了相關(guān)問題,找到了一些好的解決方案,此處參考下,做個總結(jié)吧。

由于 golang 的 sort 包本身就提供了相應(yīng)的功能, 我們就沒必要重復(fù)的造個輪子了,來看看如何利用 sort 包來實現(xiàn)吧。

sort包淺談

golang中也實現(xiàn)了排序算法的包sort包,sort 包 在內(nèi)部實現(xiàn)了四種基本的排序算法:插入排序(insertionSort)、歸并排序(symMerge)、堆排序(heapSort)和快速排序(quickSort); sort 包會依據(jù)實際數(shù)據(jù)自動選擇最優(yōu)的排序算法。

所以我們寫代碼時只需要考慮實現(xiàn) sort.Interface 這個類型就可以了。

粗略的看看sort包

func Sort(data Interface) {
 // Switch to heapsort if depth of 2*ceil(lg(n+1)) is reached.
 n := data.Len()
 maxDepth := 0
 for i := n; i > 0; i >>= 1 {
 maxDepth++
 }
 maxDepth *= 2
 quickSort(data, 0, n, maxDepth)
}
type Interface interface {
 // Len is the number of elements in the collection.
 Len() int
 // Less reports whether the element with
 // index i should sort before the element with index j.
 Less(i, j int) bool
 // Swap swaps the elements with indexes i and j.
 Swap(i, j int)
}
// 內(nèi)部實現(xiàn)的四種排序算法
// 插入排序
func insertionSort(data Interface, a, b int)
// 堆排序
func heapSort(data Interface, a, b int)
// 快速排序
func quickSort(data Interface, a, b, maxDepth int)
// 歸并排序
func symMerge(data Interface, a, m, b int)

所以要調(diào)用sort.Sort() 來實現(xiàn)自定義類型排序,只需要我們的類型實現(xiàn) Interface 接口類型中的三個方法即可。

先看看 sort 包本身對于 []int 類型如何排序

// 首先定義了一個[]int類型的別名IntSlice 
type IntSlice []int
// 獲取此 slice 的長度
func (p IntSlice) Len() int   { return len(p) }
// 比較兩個元素大小 升序
func (p IntSlice) Less(i, j int) bool { return p[i]  p[j] }
// 交換數(shù)據(jù)
func (p IntSlice) Swap(i, j int)  { p[i], p[j] = p[j], p[i] }
// sort.Ints()內(nèi)部調(diào)用Sort() 方法實現(xiàn)排序
// 注意 要先將[]int 轉(zhuǎn)換為 IntSlice類型 因為此類型才實現(xiàn)了Interface的三個方法 
func Ints(a []int) { Sort(IntSlice(a)) }

照葫蘆畫瓢 我們來對自定義的結(jié)構(gòu)體類型進行降序排序

package main
import (
 "fmt"
 "sort"
)
type Person struct {
 Name string
 Age int
}
type Persons []Person
// 獲取此 slice 的長度
func (p Persons) Len() int { return len(p) }
// 根據(jù)元素的年齡降序排序 (此處按照自己的業(yè)務(wù)邏輯寫) 
func (p Persons) Less(i, j int) bool {
 return p[i].Age > p[j].Age
}
// 交換數(shù)據(jù)
func (p Persons) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func main() {
 persons := Persons{
 {
 Name: "test1",
 Age: 20,
 },
 {
 Name: "test2",
 Age: 22,
 },
 {
 Name: "test3",
 Age: 21,
 },
 }
 fmt.Println("排序前")
 for _, person := range persons {
 fmt.Println(person.Name, ":", person.Age)
 }
 sort.Sort(persons)
 fmt.Println("排序后")
 for _, person := range persons {
 fmt.Println(person.Name, ":", person.Age)
 }
}

其實,一般 Len()Swap() 基本不做改變,只有涉及到元素比較的 Less() 方法會有所改變。

當(dāng)我們對某一個結(jié)構(gòu)體中多個字段進行排序時怎么辦,難道每排序一個就寫下這三個方法么,當(dāng)然不是。我們可以利用嵌套結(jié)構(gòu)體來解決這個問題。因為嵌套結(jié)構(gòu)體可以繼承父結(jié)構(gòu)體的所有屬性和方法

比如我想對上面 Person 的 Name 字段和 Age 對要排序,我們可以利用嵌套結(jié)構(gòu)體來改進一下。

package main
import (
 "fmt"
 "sort"
)
type Person struct {
 Name string
 Age int
}
type Persons []Person
// Len()方法和Swap()方法不用變化
// 獲取此 slice 的長度
func (p Persons) Len() int { return len(p) }
// 交換數(shù)據(jù)
func (p Persons) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
// 嵌套結(jié)構(gòu)體 將繼承 Person 的所有屬性和方法
// 所以相當(dāng)于SortByName 也實現(xiàn)了 Len() 和 Swap() 方法
type SortByName struct{ Persons }
// 根據(jù)元素的姓名長度降序排序 (此處按照自己的業(yè)務(wù)邏輯寫)
func (p SortByName) Less(i, j int) bool {
 return len(p.Persons[i].Name) > len(p.Persons[j].Name)
}
type SortByAge struct{ Persons }
// 根據(jù)元素的年齡降序排序 (此處按照自己的業(yè)務(wù)邏輯寫)
func (p SortByAge) Less(i, j int) bool {
 return p.Persons[i].Age > p.Persons[j].Age
}
func main() {
 persons := Persons{
 {
 Name: "test123",
 Age: 20,
 },
 {
 Name: "test1",
 Age: 22,
 },
 {
 Name: "test12",
 Age: 21,
 },
 }
 fmt.Println("排序前")
 for _, person := range persons {
 fmt.Println(person.Name, ":", person.Age)
 }
 sort.Sort(SortByName{persons})
 fmt.Println("排序后")
 for _, person := range persons {
 fmt.Println(person.Name, ":", person.Age)
 }
}

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • Golang中的自定義函數(shù)詳解
  • Go語言之自定義集合Set
  • goLang引入自定義包的方法

標(biāo)簽:阿壩 泰安 滄州 瀘州 昭通 東營 晉中 駐馬店

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang對自定義類型進行排序的解決方法》,本文關(guān)鍵詞  golang,對,自定義,類型,進行,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang對自定義類型進行排序的解決方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang對自定義類型進行排序的解決方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    一区二区三区日韩欧美| 91精品啪在线观看国产60岁| 欧美日韩国产不卡| 国产精品久久久久婷婷| 国内外成人在线视频| 宅男噜噜噜66一区二区66| 亚洲欧美经典视频| av一区二区三区黑人| 国产精品网站在线播放| 国产精品白丝av| 久久久久久久久久久久久夜| 国产一区日韩二区欧美三区| 久久日一线二线三线suv| 激情综合五月婷婷| 久久久三级国产网站| 国产乱淫av一区二区三区 | 欧美另类z0zxhd电影| 亚洲乱码国产乱码精品精小说 | 日韩一区二区三区精品视频| 日精品一区二区三区| 91精品久久久久久久99蜜桃| 日韩电影在线观看电影| 欧美一区二区性放荡片| 精品一区二区三区免费| 久久久久久97三级| 粉嫩aⅴ一区二区三区四区五区| 亚洲国产精品高清| 在线视频国产一区| 日韩av中文在线观看| 久久久美女毛片| 粉嫩蜜臀av国产精品网站| 成人免费在线视频观看| 精品视频在线免费| 久久精品久久久精品美女| 久久久亚洲精华液精华液精华液 | 91精品久久久久久久99蜜桃| 久久99久久精品| 国产精品女主播av| 欧美视频一区二区| 九一九一国产精品| 亚洲人成网站色在线观看| 欧美精品高清视频| 成人免费视频一区二区| 亚洲一区二区综合| 久久久亚洲午夜电影| 日本韩国视频一区二区| 美女脱光内衣内裤视频久久影院| 国产亚洲欧美色| 欧美色图在线观看| 国产69精品久久99不卡| 视频一区视频二区在线观看| 国产亚洲婷婷免费| 91精品综合久久久久久| 成人美女在线视频| 日本成人超碰在线观看| 国产精品伦一区| 91精品国产91热久久久做人人| 国产91露脸合集magnet| 日韩精品一二三| 国产精品久久免费看| 欧美乱妇23p| 不卡的电影网站| 久久精品久久99精品久久| 一区二区三区在线观看欧美| 久久久久久久久久久久电影 | 精品一区二区国语对白| 亚洲乱码一区二区三区在线观看| 精品福利二区三区| 欧美喷潮久久久xxxxx| 成人三级伦理片| 精品一区二区av| 亚洲成人精品在线观看| 亚洲欧美激情一区二区| 久久精品视频免费| 精品日韩成人av| 9191久久久久久久久久久| 99麻豆久久久国产精品免费| 国产一区啦啦啦在线观看| 丝袜a∨在线一区二区三区不卡| 国产精品高清亚洲| 久久久久久电影| 精品乱人伦小说| 91精品国产综合久久久久久漫画| 成人h精品动漫一区二区三区| 国模冰冰炮一区二区| 蜜桃视频一区二区三区| 亚洲成a人片综合在线| 一区二区三区资源| 中文字幕一区av| 国产精品无码永久免费888| 久久久久久影视| 精品精品国产高清a毛片牛牛| 在线播放欧美女士性生活| 欧美性生交片4| 欧美在线制服丝袜| 91国偷自产一区二区三区成为亚洲经典 | 色综合久久综合网欧美综合网| 国产成人日日夜夜| 国产福利精品导航| 国产精品91xxx| 国产精品亚洲第一| 国产.欧美.日韩| 国产成人丝袜美腿| 成人激情免费网站| 丰满亚洲少妇av| 99九九99九九九视频精品| 色综合中文字幕国产 | 国产精品视频免费看| 亚洲精品一区二区精华| 日韩女优电影在线观看| 717成人午夜免费福利电影| 欧美午夜免费电影| 777精品伊人久久久久大香线蕉| 欧美日韩免费在线视频| 制服丝袜国产精品| 精品少妇一区二区三区在线播放| 久久亚洲春色中文字幕久久久| 久久久蜜桃精品| 亚洲欧美自拍偷拍色图| 亚洲欧美aⅴ...| 午夜精品影院在线观看| 日韩va欧美va亚洲va久久| 久久99精品视频| 大白屁股一区二区视频| 99久久777色| 在线亚洲免费视频| 欧美一级黄色录像| 日本一区二区高清| 欧美极品美女视频| 亚洲天堂中文字幕| 日韩一级高清毛片| 久久精品水蜜桃av综合天堂| 国产精品传媒入口麻豆| 夜夜嗨av一区二区三区四季av| 午夜电影一区二区三区| 国产一区二区精品久久91| 国产一区二区三区四区五区美女| 一卡二卡欧美日韩| 捆绑调教一区二区三区| 国产福利精品导航| 欧美在线观看禁18| 精品裸体舞一区二区三区| 国产精品丝袜91| 亚洲高清久久久| 亚洲精品视频在线观看免费| 蜜桃精品视频在线观看| 处破女av一区二区| 欧美猛男男办公室激情| 久久久久免费观看| 亚洲一区二区综合| 日本女人一区二区三区| 成人网页在线观看| 日韩欧美国产综合在线一区二区三区| 国产精品网站导航| 美脚の诱脚舐め脚责91 | 国产欧美日韩亚州综合| 亚洲国产欧美另类丝袜| 国产a久久麻豆| 91精品麻豆日日躁夜夜躁| 日韩一区欧美一区| 国产裸体歌舞团一区二区| 欧美日韩中文国产| 最新成人av在线| 国产剧情一区二区| 7777精品久久久大香线蕉| 日韩一区有码在线| 福利电影一区二区| 欧美成人乱码一区二区三区| 一区二区成人在线观看| 成人精品免费看| 久久这里只精品最新地址| 日本不卡在线视频| 在线免费观看日韩欧美| 国产午夜亚洲精品理论片色戒 | 国产精品久久久久毛片软件| 麻豆国产91在线播放| 欧美三级韩国三级日本一级| 国产精品视频一二三| 日本亚洲三级在线| 欧美在线观看一区| 一区二区三区在线免费播放| 成人app下载| 久久久精品黄色| 狠狠色丁香九九婷婷综合五月| 欧美午夜电影一区| 亚洲精品欧美在线| 91美女片黄在线观看| 国产精品另类一区| 国产激情精品久久久第一区二区| 欧美一区二区在线播放| 五月综合激情网| 欧美久久久久久久久| 亚洲第一福利视频在线| 欧美视频一区在线| 天堂久久一区二区三区| 欧美久久一二三四区| 日韩国产高清在线| 欧美一卡二卡三卡四卡| 日本不卡在线视频| 欧美成人女星排行榜|