亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

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

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

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

前言

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

由于 golang 的 sort 包本身就提供了相應的功能, 我們就沒必要重復的造個輪子了,來看看如何利用 sort 包來實現吧。

sort包淺談

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

所以我們寫代碼時只需要考慮實現 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)
}
// 內部實現的四種排序算法
// 插入排序
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)

所以要調用sort.Sort() 來實現自定義類型排序,只需要我們的類型實現 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] }
// 交換數據
func (p IntSlice) Swap(i, j int)  { p[i], p[j] = p[j], p[i] }
// sort.Ints()內部調用Sort() 方法實現排序
// 注意 要先將[]int 轉換為 IntSlice類型 因為此類型才實現了Interface的三個方法 
func Ints(a []int) { Sort(IntSlice(a)) }

照葫蘆畫瓢 我們來對自定義的結構體類型進行降序排序

package main
import (
 "fmt"
 "sort"
)
type Person struct {
 Name string
 Age int
}
type Persons []Person
// 獲取此 slice 的長度
func (p Persons) Len() int { return len(p) }
// 根據元素的年齡降序排序 (此處按照自己的業務邏輯寫) 
func (p Persons) Less(i, j int) bool {
 return p[i].Age > p[j].Age
}
// 交換數據
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() 方法會有所改變。

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

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

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) }
// 交換數據
func (p Persons) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
// 嵌套結構體 將繼承 Person 的所有屬性和方法
// 所以相當于SortByName 也實現了 Len() 和 Swap() 方法
type SortByName struct{ Persons }
// 根據元素的姓名長度降序排序 (此處按照自己的業務邏輯寫)
func (p SortByName) Less(i, j int) bool {
 return len(p.Persons[i].Name) > len(p.Persons[j].Name)
}
type SortByAge struct{ Persons }
// 根據元素的年齡降序排序 (此處按照自己的業務邏輯寫)
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)
 }
}

總結

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

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

標簽:阿壩 泰安 滄州 瀘州 昭通 東營 晉中 駐馬店

巨人網絡通訊聲明:本文標題《golang對自定義類型進行排序的解決方法》,本文關鍵詞  golang,對,自定義,類型,進行,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang對自定義類型進行排序的解決方法》相關的同類信息!
  • 本頁收集關于golang對自定義類型進行排序的解決方法的相關信息資訊供網民參考!
  • 推薦文章
    成人a级高清视频在线观看| 欧美大片毛片aaa免费看| 成人影视在线播放| 国产伦精品一区二区三区无广告| 尤物视频网站在线观看| 韩国毛片免费| 日韩avdvd| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 夜夜操网| 日本在线www| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 欧美1区| 日本特黄一级| 国产伦精品一区二区三区无广告| 国产伦精品一区二区三区在线观看| 黄色福利片| 国产极品精频在线观看| 日日日夜夜操| 亚洲精品久久玖玖玖玖| 91麻豆精品国产综合久久久| 亚洲精品影院久久久久久| 九九九在线视频| 日韩欧美一二三区| 日韩免费在线视频| 国产麻豆精品hdvideoss| a级毛片免费全部播放| 精品视频免费在线| 99热精品一区| 国产高清视频免费观看| 欧美一区二区三区性| 国产91精品一区| 午夜欧美福利| 精品视频一区二区三区免费| 韩国妈妈的朋友在线播放| 在线观看导航| 国产成人精品综合久久久| 日韩免费在线观看视频| 欧美日本二区| 欧美另类videosbestsex| 亚洲爆爽| 成人高清护士在线播放| 亚洲天堂免费| 国产精品12| 天天做日日爱夜夜爽| 天天色成人| 可以免费看毛片的网站| 成人av在线播放| 精品久久久久久综合网| 欧美激情一区二区三区中文字幕| 国产成人啪精品视频免费软件| 天天做日日爱| 日本伦理网站| 日韩欧美一二三区| 国产91精品一区| 精品视频一区二区三区| 国产成人精品影视| 国产国语在线播放视频| 国产不卡在线观看| 久久精品大片| 久久久久久久网| 中文字幕97| 亚欧乱色一区二区三区| 999精品在线| 国产成人啪精品视频免费软件| 国产麻豆精品免费密入口| 欧美激情影院| 免费毛片播放| 久久国产一区二区| 韩国妈妈的朋友在线播放| 沈樵在线观看福利| 九九精品影院| 精品国产香蕉在线播出| 成人免费一级纶理片| 可以在线看黄的网站| 91麻豆精品国产高清在线| 亚欧视频在线| 国产成人啪精品视频免费软件| 日韩一级精品视频在线观看| 日韩在线观看视频网站| 亚欧视频在线| 国产不卡在线看| 可以免费在线看黄的网站| 一级女性全黄久久生活片| 精品久久久久久综合网| 毛片高清| 四虎影视精品永久免费网站| 日韩一级黄色片| 精品视频免费在线| 精品久久久久久综合网| 国产网站免费视频| 九九久久99| 国产高清在线精品一区a| 精品久久久久久中文| 99久久精品国产高清一区二区 | 国产网站免费在线观看| 国产成人精品在线| 午夜在线亚洲男人午在线| 四虎影视库| 久久久久久久网| 一a一级片| 999久久狠狠免费精品| 四虎影视精品永久免费网站| 日本伦理黄色大片在线观看网站| 99久久精品国产麻豆| 免费的黄视频| 欧美1卡一卡二卡三新区| 欧美激情一区二区三区视频高清| 国产a免费观看| 欧美激情一区二区三区视频 | 天天色色网| 午夜欧美福利| 成人免费一级毛片在线播放视频| 午夜激情视频在线播放| 四虎影视久久| 99热热久久| 欧美电影免费看大全| 国产精品自拍在线| 青青青草视频在线观看| 久草免费在线色站| 久久精品大片| 精品在线观看国产| 国产视频一区二区在线播放| 四虎影视久久| 日韩男人天堂| 日本在线不卡免费视频一区| 美女免费精品视频在线观看| 国产网站免费| 欧美一级视频免费观看| 日本免费乱理伦片在线观看2018| 日韩av成人| 国产网站免费视频| 国产伦精品一区二区三区在线观看| 成人免费观看男女羞羞视频| 在线观看成人网 | 青青青草影院| 99久久精品国产麻豆| 四虎影视精品永久免费网站| 久久国产精品自线拍免费| 久久国产精品自由自在| 亚飞与亚基在线观看| 午夜欧美福利| 国产不卡精品一区二区三区| 国产不卡在线播放| 精品在线视频播放| 日本伦理网站| 国产原创视频在线| 欧美激情一区二区三区中文字幕| 黄色免费网站在线| 亚洲女人国产香蕉久久精品| 天天做人人爱夜夜爽2020| 一级毛片视频在线观看| 久草免费在线观看| 久久久久久久免费视频| 欧美激情中文字幕一区二区| 91麻豆tv| 99久久精品国产片| 在线观看成人网 | 尤物视频网站在线观看| 国产a免费观看| 成人影院久久久久久影院| 国产极品精频在线观看| 天天色色网| 国产成人精品一区二区视频| 日本特黄一级| 欧美a级大片| 欧美激情一区二区三区视频高清| 二级特黄绝大片免费视频大片| 国产视频在线免费观看| 精品久久久久久综合网| 亚洲女人国产香蕉久久精品| 日韩字幕在线| 一级毛片看真人在线视频| 日本免费看视频| 天天做日日干| 欧美另类videosbestsex| 亚飞与亚基在线观看| 精品久久久久久中文字幕一区 | 精品视频免费在线| 韩国三级香港三级日本三级la| 欧美日本韩国| 精品久久久久久综合网| 精品久久久久久中文字幕2017| 久久99中文字幕| 免费毛片播放| 久久成人亚洲| 九九九国产| 欧美a级大片| 国产视频久久久久| 美国一区二区三区| 久久福利影视| 国产麻豆精品hdvideoss| 色综合久久天天综合观看| 天天做日日爱| 欧美激情在线精品video| 日韩中文字幕在线观看视频| 日韩av东京社区男人的天堂| 日韩在线观看视频免费| 精品毛片视频| 国产网站免费| 免费国产在线观看|