關(guān)于golang之排序的使用方法-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)關(guān)于golang之排序的使用方法,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

成都地區(qū)優(yōu)秀IDC服務(wù)器托管提供商(創(chuàng)新互聯(lián)).為客戶提供專業(yè)的中國(guó)電信成都樞紐中心,四川各地服務(wù)器托管,中國(guó)電信成都樞紐中心、多線服務(wù)器托管.托管咨詢專線:18980820575

golang標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)了許多常用的排序方法,比如對(duì)整數(shù)序列排序:sort.Ints(),
那么如果對(duì)自定義的數(shù)據(jù)結(jié)構(gòu)排序怎么做呢?
比如對(duì)一個(gè)用戶列表,按他們的積分排序:

首先定義數(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,也就是用戶列表如何使用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)提供的排序不能滿足我們的需要,
還是可以自己實(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://muchs.cn/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)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)