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程式設計環境請參考:/2/23/798.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]