Go by Example 中文:使用函數自定義排序

Go by Example 中文:使用函數自定義排序

有時候我們想使用和集合的自然排序不同的方法對集合進行排序。例如,我們想按照字母的長度而不是首字母順序對字符串排序。這裏是一個 Go 自定義排序的例子。

package main
import "sort"
import "fmt"
// 爲了在 Go 中使用自定義函數進行排序,我們需要一個對應的類型。
// 這裏我們創建一個爲內置 []string 類型的別名的ByLength 類型,

type ByLength []string
// 我們在類型中實現了 sort.Interface 的 Len,Less和 Swap 方法,這樣我們就可以使用 sort 包的通用Sort 方法了,
// Len 和 Swap 通常在各個類型中都差不多,Less 將控制實際的自定義排序邏輯。
// 在我們的例子中,我們想按字符串長度增加的順序來排序,所以這裏使用了 len(s[i]) 和 len(s[j])。

func (s ByLength) Len() int {
    return len(s)
}
func (s ByLength) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}
func (s ByLength) Less(i, j int) bool {
    return len(s[i]) < len(s[j])
}

//一切都準備好了,我們現在可以通過將原始的 fruits 切片轉型成 ByLength 來實現我們的自定排序了。
// 然後對這個轉型的切片使用 sort.Sort 方法。
func main() {
    fruits := []string{"peach", "banana", "kiwi"}
    sort.Sort(ByLength(fruits))
    fmt.Println(fruits)
}

運行這個程序,和預期的一樣,顯示了一個按照字符串長度排序的列表。
運行結果如下圖所示:
sorting-by-functions
類似的,參照這個創建一個自定義類型的方法,實現這個類型的這三個接口方法,然後在一個這個自定義類型的集合上調用 sort.Sort 方法,我們就可以使用任意的函數來排序 Go 切片了。
下一個例子: Panic.

Go by Example 中文項目地址爲:https://github.com/everyx/gobyexample,英文原Github地址爲:mmcgrana/gobyexample,英文博文地址爲:Go by Example

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章