日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang 中的sort 包

發布時間:2025/6/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang 中的sort 包 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

sort接口

一個很好的例子是來自標準庫的 sort 包,要對一組數字或字符串排序,只需要實現三個方法:反映元素個數的 Len() 方法、比較第 i 和 j 個元素的 Less(i, j) 方法以及交換第 i 和 j 個元素的 Swap(i, j) 方法。

排序函數的算法只會使用到這三個方法(可以使用任何排序算法來實現,此處我們使用冒泡排序):

func Sort(data Sorter) {for pass := 1; pass < data.Len(); pass++ {for i := 0;i < data.Len() - pass; i++ {if data.Less(i+1, i) {data.Swap(i, i + 1)}}} }

Sort 函數接收一個接口類型參數:Sorter ,它聲明了這些方法:

type Sorter interface {Len() intLess(i, j int) boolSwap(i, j int) }

參數中的 int 是待排序序列長度的類型,而不是說要排序的對象一定要是一組 int。i 和 j 表示元素的整型索引,長度也是整型的。

現在如果我們想對一個 int 數組進行排序,所有必須做的事情就是:為數組定一個類型并在它上面實現 Sorter 接口的方法:

type IntArray []int func (p IntArray) Len() int { return len(p) } func (p IntArray) Less(i, j int) bool { return p[i] < p[j] } func (p IntArray) Swap(i, j int) { p[i], p[j] = p[j], p[i] }

下面是調用排序函數的一個具體例子:

data := []int{74, 59, 238, -784, 9845, 959, 905, 0, 0, 42, 7586, -5467984, 7586} a := sort.IntArray(data) //conversion to type IntArray from package sort sort.Sort(a)

同樣的原理,排序函數可以用于一個浮點型數組,一個字符串數組,或者一個表示每周各天的結構體 dayArray.

示例 11.6 sort.go:

package sorttype Sorter interface {Len() intLess(i, j int) boolSwap(i, j int) }func Sort(data Sorter) {for pass := 1; pass < data.Len(); pass++ {for i := 0; i < data.Len()-pass; i++ {if data.Less(i+1, i) {data.Swap(i, i+1)}}} }func IsSorted(data Sorter) bool {n := data.Len()for i := n - 1; i > 0; i-- {if data.Less(i, i-1) {return false}}return true }// Convenience types for common cases type IntArray []intfunc (p IntArray) Len() int { return len(p) } func (p IntArray) Less(i, j int) bool { return p[i] < p[j] } func (p IntArray) Swap(i, j int) { p[i], p[j] = p[j], p[i] }type StringArray []stringfunc (p StringArray) Len() int { return len(p) } func (p StringArray) Less(i, j int) bool { return p[i] < p[j] } func (p StringArray) Swap(i, j int) { p[i], p[j] = p[j], p[i] }// Convenience wrappers for common cases func SortInts(a []int) { Sort(IntArray(a)) } func SortStrings(a []string) { Sort(StringArray(a)) }func IntsAreSorted(a []int) bool { return IsSorted(IntArray(a)) } func StringsAreSorted(a []string) bool { return IsSorted(StringArray(a)) }

示例 11.7 sortmain.go:

package mainimport ("./sort""fmt" )func ints() {data := []int{74, 59, 238, -784, 9845, 959, 905, 0, 0, 42, 7586, -5467984, 7586}a := sort.IntArray(data) //conversion to type IntArraysort.Sort(a)if !sort.IsSorted(a) {panic("fails")}fmt.Printf("The sorted array is: %v\n", a) }func strings() {data := []string{"monday", "friday", "tuesday", "wednesday", "sunday", "thursday", "", "saturday"}a := sort.StringArray(data)sort.Sort(a)if !sort.IsSorted(a) {panic("fail")}fmt.Printf("The sorted array is: %v\n", a) }type day struct {num intshortName stringlongName string }type dayArray struct {data []*day }func (p *dayArray) Len() int { return len(p.data) } func (p *dayArray) Less(i, j int) bool { return p.data[i].num < p.data[j].num } func (p *dayArray) Swap(i, j int) { p.data[i], p.data[j] = p.data[j], p.data[i] }func days() {Sunday := day{0, "SUN", "Sunday"}Monday := day{1, "MON", "Monday"}Tuesday := day{2, "TUE", "Tuesday"}Wednesday := day{3, "WED", "Wednesday"}Thursday := day{4, "THU", "Thursday"}Friday := day{5, "FRI", "Friday"}Saturday := day{6, "SAT", "Saturday"}data := []*day{&Tuesday, &Thursday, &Wednesday, &Sunday, &Monday, &Friday, &Saturday}a := dayArray{data}sort.Sort(&a)if !sort.IsSorted(&a) {panic("fail")}for _, d := range data {fmt.Printf("%s ", d.longName)}fmt.Printf("\n") }func main() {ints()strings()days() }

輸出:

The sorted array is: [-5467984 -784 0 0 42 59 74 238 905 959 7586 7586 9845] The sorted array is: [ friday monday saturday sunday thursday tuesday wednesday] Sunday Monday Tuesday Wednesday Thursday Friday Saturday

備注:

上面的例子幫助我們進一步了解了接口的意義和使用方式。對于基本類型的排序,標準庫已經提供了相關的排序函數,所以不需要我們再重復造輪子了。對于一般性的排序,sort 包定義了一個接口:

type Interface interface {
Len() int
Less(i, j int) bool
Swap(i, j int)
}
這個接口總結了需要用于排序的抽象方法,函數 Sort(data Interface) 用來對此類對象進行排序,可以用它們來實現對其他數據(非基本類型)進行排序。在上面的例子中,我們也是這么做的,不僅可以對 int 和 string 序列進行排序,也可以對用戶自定義類型 dayArray 進行排序。

總結

以上是生活随笔為你收集整理的golang 中的sort 包的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。