Go按自定義函數排序實例

有時候,我們希望通過除了自然順序以外的其他方式對集合進行排序。例如,假設我們想按字符串的長度而不是字母順序對字符串進行排序。下面是Go語言中自定義排序的示例。

爲了使用Go語言中的自定義函數進行排序,我們需要一個相應的類型。這裏創建了一個ByLength類型,它只是內置 []string類型的別名。

需要實現sort.Interface - LenLessSwap - 在這個類型上,所以可以使用 sort 包中的一般Sort函數。LenSwap通常在類型之間是相似的,Less保存實際的自定義排序邏輯。在這個例子中,要按照字符串長度的增加順序排序,因此在這裏使用len(s [i])len(s [j])

所有這些都到位後,現在可以通過將原始 fruits 切片轉換爲ByLength來實現自定義排序,然後對該類型切片使用sort.Sort()方法。

運行程序根據需要顯示按字符串長度排序的列表。

通過遵循創建自定義類型的模式,在該類型上實現三個Interface方法,然後在自定義類型的集合上調用sort.Sort,可以通過任意函數對Go切片進行排序。

所有的示例代碼,都放在 F:\worksp\golang 目錄下。安裝Go編程環境請參考:http://www.yiibai.com/go/go\_environment.html

sorting-by-functions.go的完整代碼如下所示 -

package main

import "sort"
import "fmt"

// In order to sort by a custom function in Go, we need a
// corresponding type. Here we've created a `ByLength`
// type that is just an alias for the builtin `[]string`
// type.
type ByLength []string

// We implement `sort.Interface` - `Len`, `Less`, and
// `Swap` - on our type so we can use the `sort` package's
// generic `Sort` function. `Len` and `Swap`
// will usually be similar across types and `Less` will
// hold the actual custom sorting logic. In our case we
// want to sort in order of increasing string length, so
// we use `len(s[i])` and `len(s[j])` here.
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])
}

// With all of this in place, we can now implement our
// custom sort by casting the original `fruits` slice to
// `ByLength`, and then use `sort.Sort` on that typed
// slice.
func main() {
    fruits := []string{"peach", "banana", "kiwi"}
    sort.Sort(ByLength(fruits))
    fmt.Println(fruits)
}

執行上面代碼,將得到以下輸出結果 -

F:\worksp\golang>go run sorting-by-functions.go
[kiwi peach banana]