44 lines
1.3 KiB
Go
44 lines
1.3 KiB
Go
// Sometimes we'll want to sort a collection by something
|
|
// other than its natural order. For example, suppose we
|
|
// wanted to sort strings by their length instead of
|
|
// alphabetically. Here's an example of custom sorts
|
|
// in 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)
|
|
}
|