亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

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

2020-04-01 19:00:04
字體:
來源:轉載
供稿:網友

前言

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

由于 golang/177808.html">golang/196398.html">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 mainimport ( "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 mainimport ( "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) }}

總結

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩免费区域视频在线观看| 欧美另类69精品久久久久9999| 欧美一区二区大胆人体摄影专业网站| 国产精品视频一区二区高潮| 欧美日韩午夜剧场| 精品国产福利在线| 中文国产亚洲喷潮| 亚洲精品福利在线观看| 欧美日韩国产中文精品字幕自在自线| 国产亚洲美女精品久久久| 欧美国产日韩一区二区| 国产在线观看一区二区三区| 亚洲精品综合久久中文字幕| 亚洲精品成人免费| 亚洲摸下面视频| 色一情一乱一区二区| 国产不卡一区二区在线播放| 国产精品在线看| 欧美激情网站在线观看| 色综合影院在线| 国产精品v日韩精品| 亚洲一区久久久| 欧美另类第一页| 78m国产成人精品视频| 午夜精品久久久久久久白皮肤| 久久人人爽人人爽爽久久| 亚洲人a成www在线影院| 国产精品视频一区二区三区四| 正在播放国产一区| 668精品在线视频| 国产精品福利在线| 亚洲 日韩 国产第一| 国产一区玩具在线观看| 欧美伊久线香蕉线新在线| 亚洲国产精品资源| 亚洲wwwav| 日本aⅴ大伊香蕉精品视频| 超碰日本道色综合久久综合| 欧美疯狂xxxx大交乱88av| 欧美一级免费看| 在线观看视频99| 日本午夜精品理论片a级appf发布| 日本在线观看天堂男亚洲| 91在线高清视频| 一区二区三区国产视频| 美女福利视频一区| 国产精品黄页免费高清在线观看| 亚洲第一国产精品| 国产91成人video| 国产精品嫩草影院一区二区| 国色天香2019中文字幕在线观看| 精品小视频在线| 一本大道久久加勒比香蕉| 午夜精品一区二区三区视频免费看| 欧美性在线视频| 成人午夜高潮视频| 欧美日韩免费在线| 91国在线精品国内播放| 尤物九九久久国产精品的特点| 91av中文字幕| 孩xxxx性bbbb欧美| 日韩激情第一页| 欧美亚洲一区在线| 日韩精品在线视频观看| 伦伦影院午夜日韩欧美限制| 欧美另类暴力丝袜| 秋霞成人午夜鲁丝一区二区三区| 国产精品自产拍在线观看中文| 国产丝袜一区视频在线观看| 久久91亚洲精品中文字幕| 国产成人精品最新| 亚洲伊人久久综合| 日本亚洲欧洲色α| 欧美一区深夜视频| 欧美黑人极品猛少妇色xxxxx| 欧美午夜xxx| 九九热精品视频国产| 亚洲xxxx3d| 亚洲精品自产拍| 日韩欧美亚洲综合| 国产精品久久久久77777| 欧美日韩激情小视频| 久青草国产97香蕉在线视频| 国产精品久久久久久久久久免费| 欧美疯狂xxxx大交乱88av| 亚洲最新中文字幕| 成人在线国产精品| 亚洲一级片在线看| 精品久久久一区| 92国产精品久久久久首页| 欧美国产日韩视频| 88国产精品欧美一区二区三区| 欧美第一页在线| 午夜精品久久久久久久99黑人| 亚洲男女自偷自拍图片另类| 欧美与欧洲交xxxx免费观看| 欧美日韩国产精品一区二区不卡中文| 揄拍成人国产精品视频| 国产精品夜色7777狼人| 亚洲午夜未满十八勿入免费观看全集| 91久久久久久久久久久久久| 在线亚洲午夜片av大片| 久久久欧美一区二区| 久久精品国产2020观看福利| 91九色国产在线| 亚洲综合视频1区| 成人av在线天堂| 久久影视免费观看| 韩国一区二区电影| 成人av在线天堂| 国产精品午夜国产小视频| 欧美激情视频一区| 热草久综合在线| 欧美壮男野外gaytube| 68精品久久久久久欧美| 日韩av网站在线| 一个色综合导航| 欧美视频第一页| 国产欧美精品在线播放| 欧美日本啪啪无遮挡网站| 日韩av免费看网站| 久久久久久久久久久久av| 97久久精品人人澡人人爽缅北| 亚洲三级av在线| 亚洲美女福利视频网站| 亚洲欧美一区二区三区四区| 一区二区三区高清国产| 国产精品va在线播放我和闺蜜| 在线看欧美日韩| 精品国产区一区二区三区在线观看| 操91在线视频| 欧美日韩国产中文精品字幕自在自线| 精品美女久久久久久免费| 亚洲国产欧美一区二区三区同亚洲| 成人av.网址在线网站| 国产精品久久久久久久久久三级| 中文字幕日韩有码| 欧美日韩一区二区三区| 欧美专区在线视频| 亚洲va欧美va国产综合久久| 欧美大片第1页| 日本国产欧美一区二区三区| 欧美日产国产成人免费图片| 欧日韩在线观看| 精品久久香蕉国产线看观看gif| 国产一区玩具在线观看| 精品亚洲永久免费精品| 97免费视频在线| 精品中文字幕在线| 91免费综合在线| 欧美成人精品激情在线观看| 日韩成人在线电影网| 国产精品久久一区主播| 欧美色另类天堂2015| 日韩大片免费观看视频播放| 91精品视频播放| 欧美日韩一区二区精品| 欧美日韩一区二区精品| 成人黄色在线观看| 91欧美精品午夜性色福利在线| 日韩一区二区精品视频| 免费91在线视频| 欧美激情女人20p| 日本精品久久久|