這篇文章將為大家詳細(xì)講解有關(guān)關(guān)于golang之排序的使用方法,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
成都地區(qū)優(yōu)秀IDC服務(wù)器托管提供商(創(chuàng)新互聯(lián)).為客戶(hù)提供專(zhuān)業(yè)的中國(guó)電信成都樞紐中心,四川各地服務(wù)器托管,中國(guó)電信成都樞紐中心、多線服務(wù)器托管.托管咨詢(xún)專(zhuān)線:18980820575golang標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)了許多常用的排序方法,比如對(duì)整數(shù)序列排序:sort.Ints()
,
那么如果對(duì)自定義的數(shù)據(jù)結(jié)構(gòu)排序怎么做呢?
比如對(duì)一個(gè)用戶(hù)列表,按他們的積分排序:
首先定義數(shù)據(jù)結(jié)構(gòu),為了能清楚說(shuō)明問(wèn)題,只給兩個(gè)字段。
type User struct { Name string Score int}type Users []User
golang中想要自定義排序,自己的結(jié)構(gòu)要實(shí)現(xiàn)三個(gè)方法:
// 摘自: $GOROOT/src/sort/sort.gotype 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)}
這個(gè)設(shè)計(jì)太妙了有沒(méi)有,想想我們學(xué)過(guò)的排序,都要序列長(zhǎng)度,比大小,交換元素。
那對(duì)上述的Users,也就是用戶(hù)列表如何使用golang的排序呢?
先按它說(shuō)的,實(shí)現(xiàn)這三個(gè)方法:
func (us Users) Len() int { return len(us)}func (us Users) Less(i, j int) bool { return us[i].Score < us[j].Score}func (us Users) Swap(i, j int) { us[i], us[j] = us[j], us[i]}
然后就能排序了:
func main() { var us Users const N = 6 for i := 0; i < N; i++ { us = append(us, User{ Name: "user" + strconv.Itoa(i), Score: rand.Intn(N * N), }) } fmt.Printf("%v\n", us) sort.Sort(us) fmt.Printf("%v\n", us)}
可能的輸出為:
[{user0 5} {user1 15} {user2 11} {user3 11} {user4 13} {user5 6}]
[{user0 5} {user5 6} {user2 11} {user3 11} {user4 13} {user1 15}]
可以看到,分?jǐn)?shù)從小到大排列了。
不過(guò)一般我們積分這種東西都是從大到小排序的,只需將sort.Sort(us)
改成sort.Sort(sort.Reverse(us))
就行。
確實(shí)很方便。
當(dāng)然,如果出于特殊需要,系統(tǒng)提供的排序不能滿(mǎn)足我們的需要,
還是可以自己實(shí)現(xiàn)排序的, 比如針對(duì)上述,自己來(lái)排序(從小到大):
func myqsort(us []User, lo, hi int) { if lo < hi { pivot := partition(us, lo, hi) myqsort(us, lo, pivot-1) myqsort(us, pivot+1, hi) }}func partition(us []User, lo, hi int) int { tmp := us[lo] for lo < hi { for lo < hi && us[hi].Score >= tmp.Score { hi-- } us[lo] = us[hi] for lo < hi && us[lo].Score <= tmp.Score { lo++ } us[hi] = us[lo] } us[lo] = tmp return hi}
一個(gè)簡(jiǎn)單的快速排序,調(diào)用時(shí)只需要myqsort(us)
就可以 了。
關(guān)于關(guān)于golang之排序的使用方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
文章標(biāo)題:關(guān)于golang之排序的使用方法-創(chuàng)新互聯(lián)
標(biāo)題來(lái)源:http://aaarwkj.com/article26/dpiicg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、軟件開(kāi)發(fā)、網(wǎng)站維護(hù)、靜態(tài)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容